Skip to content

TypeScript Types Documentation

MediaFox provides comprehensive TypeScript support with detailed type definitions for all APIs. This document covers all the available types and interfaces.

Core Player Types

PlayerOptions

typescript
interface PlayerOptions {
  /** Canvas element for video rendering */
  renderTarget?: HTMLCanvasElement | OffscreenCanvas;

  /** Audio context for audio playback */
  audioContext?: AudioContext;

  /** Initial volume level (0-1) */
  volume?: number;

  /** Initial mute state */
  muted?: boolean;

  /** Initial playback speed (0.25-4) */
  playbackRate?: number;

  /** Auto-play when media loads */
  autoplay?: boolean;

  /** Preloading strategy */
  preload?: 'none' | 'metadata' | 'auto';

  /** CORS setting for cross-origin content */
  crossOrigin?: string;

  /** Maximum cache size for buffering */
  maxCacheSize?: number;
}

PlayerStateData

typescript
interface PlayerStateData {
  /** Overall player state */
  state: PlayerState;

  /** Current playback time in seconds */
  currentTime: number;

  /** Total duration in seconds */
  duration: number;

  /** Buffered time ranges */
  buffered: TimeRange[];

  /** Volume level (0-1) */
  volume: number;

  /** Mute state */
  muted: boolean;

  /** Playback speed */
  playbackRate: number;

  /** Whether media is actively playing */
  playing: boolean;

  /** Whether playback is paused */
  paused: boolean;

  /** Whether playback has ended */
  ended: boolean;

  /** Whether seeking is in progress */
  seeking: boolean;

  /** Current error, if any */
  error: Error | null;

  /** Media information */
  mediaInfo: MediaInfo | null;

  /** Available video tracks */
  videoTracks: VideoTrackInfo[];

  /** Available audio tracks */
  audioTracks: AudioTrackInfo[];

  /** Available subtitle tracks */
  subtitleTracks: SubtitleTrackInfo[];

  /** Currently selected video track ID */
  selectedVideoTrack: string | null;

  /** Currently selected audio track ID */
  selectedAudioTrack: string | null;

  /** Currently selected subtitle track ID */
  selectedSubtitleTrack: string | null;

  /** Whether playback can start */
  canPlay: boolean;

  /** Whether playback can continue without buffering */
  canPlayThrough: boolean;

  /** Whether this is a live stream */
  isLive: boolean;
}

PlayerState Enum

typescript
type PlayerState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused' | 'ended' | 'error';

duration: number; buffered: TimeRanges | null; seekable: TimeRanges | null;

/** Audio properties */ volume: number; muted: boolean;

/** Loading and seeking state */ loading: boolean; seeking: boolean; readyState: ReadyState;

/** Media dimensions */ videoWidth: number; videoHeight: number;

/** Playback configuration */ playbackRate: number;

/** Current track selections */ currentVideoTrack: number; currentAudioTrack: number;

/** Error state */ error: Error | null; }


### ReadyState

```typescript
enum ReadyState {
  /** No information available */
  HAVE_NOTHING = 0,

  /** Metadata loaded */
  HAVE_METADATA = 1,

  /** Current frame available */
  HAVE_CURRENT_DATA = 2,

  /** Future frames available */
  HAVE_FUTURE_DATA = 3,

  /** Enough data for continuous playback */
  HAVE_ENOUGH_DATA = 4
}

Event Types

PlayerEvents

typescript
interface PlayerEvents {
  // Playback events
  play: () => void;
  pause: () => void;
  ended: () => void;
  seeking: () => void;
  seeked: () => void;
  timeupdate: (currentTime: number) => void;
  ratechange: (playbackRate: number) => void;

  // Loading events
  loadstart: () => void;
  loadedmetadata: () => void;
  loadeddata: () => void;
  canplay: () => void;
  canplaythrough: () => void;
  progress: (buffered: TimeRanges) => void;
  waiting: () => void;
  stalled: () => void;

  // Audio events
  volumechange: (volume: number, muted: boolean) => void;

  // Error events
  error: (error: Error) => void;

  // Track events
  tracksChanged: (tracks: TrackList) => void;
  trackChanged: (type: 'video' | 'audio', trackIndex: number) => void;
  trackSwitching: (type: 'video' | 'audio') => void;
  trackSwitched: (type: 'video' | 'audio', trackIndex: number) => void;

  // Source events
  sourceChanged: (source: string) => void;

  // Player lifecycle
  ready: () => void;
  destroy: () => void;

  // Frame events
  frameChanged: (frame: VideoFrame) => void;
  frameRendered: (timestamp: number) => void;

  // Memory events
  memoryUsage: (bytes: number) => void;

  // Custom events
  [key: string]: (...args: any[]) => void;
}

EventEmitterEvents

typescript
interface EventEmitterEvents {
  /** Fired when a new listener is added */
  newListener: (event: string, listener: Function) => void;

  /** Fired when a listener is removed */
  removeListener: (event: string, listener: Function) => void;

  /** Fired when max listeners limit is exceeded */
  maxListeners: (event: string, count: number) => void;
}

Track Types

TrackList

typescript
interface TrackList {
  video: VideoTrack[];
  audio: AudioTrack[];
}

VideoTrack

typescript
interface VideoTrack {
  /** Unique track identifier */
  id: string;

  /** Human-readable track label */
  label?: string;

  /** Track language code */
  language?: string;

  /** Video dimensions */
  width: number;
  height: number;

  /** Frame rate in fps */
  frameRate: number;

  /** Bitrate in bits per second */
  bitrate?: number;

  /** Video codec information */
  codec: string;

  /** Whether track is currently enabled */
  enabled: boolean;

  /** Additional metadata */
  metadata?: Record<string, any>;
}

AudioTrack

typescript
interface AudioTrack {
  /** Unique track identifier */
  id: string;

  /** Human-readable track label */
  label?: string;

  /** Track language code */
  language?: string;

  /** Number of audio channels */
  channels: number;

  /** Sample rate in Hz */
  sampleRate: number;

  /** Bitrate in bits per second */
  bitrate?: number;

  /** Audio codec information */
  codec: string;

  /** Whether track is currently enabled */
  enabled: boolean;

  /** Additional metadata */
  metadata?: Record<string, any>;
}

Source Types

SourceInput

typescript
type SourceInput =
  | string                    // URL
  | File                      // File object
  | Blob                      // Blob object
  | ArrayBuffer               // Raw buffer
  | MediaStream               // Live stream
  | MediaSource               // Media Source Extension
  | HTMLVideoElement          // Video element
  | SourceConfig;             // Complex source configuration

SourceConfig

typescript
interface SourceConfig {
  /** Source URL or data */
  src: string | File | Blob | ArrayBuffer | MediaStream;

  /** MIME type override */
  type?: string;

  /** Source metadata */
  metadata?: SourceMetadata;

  /** Loading options */
  options?: SourceOptions;
}

SourceMetadata

typescript
interface SourceMetadata {
  /** Media title */
  title?: string;

  /** Media duration (if known) */
  duration?: number;

  /** Media dimensions (if known) */
  width?: number;
  height?: number;

  /** Available tracks information */
  tracks?: Partial<TrackList>;

  /** Custom metadata */
  [key: string]: any;
}

SourceOptions

typescript
interface SourceOptions {
  /** Preload strategy */
  preload?: 'none' | 'metadata' | 'auto';

  /** CORS mode */
  crossOrigin?: 'anonymous' | 'use-credentials';

  /** Custom headers for requests */
  headers?: Record&lt;string, string&gt;;

  /** Timeout for loading operations */
  timeout?: number;

  /** Enable progressive loading */
  progressive?: boolean;

  /** Initial buffer size */
  bufferSize?: number;
}

Store Types

StoreOptions

typescript
interface StoreOptions {
  /** Initial state */
  initialState?: Partial<PlayerState>;

  /** Enable batched updates */
  batchUpdates?: boolean;

  /** Batch update interval in ms */
  batchInterval?: number;

  /** Maximum number of subscribers */
  maxSubscribers?: number;
}

StoreSubscriber

typescript
type StoreSubscriber&lt;T&gt; = (state: T) => void;

interface StoreUnsubscribe {
  (): void;
}

Error Types

PlayerError

typescript
class PlayerError extends Error {
  readonly code: PlayerErrorCode;
  readonly details?: any;
  readonly timestamp: number;

  constructor(
    code: PlayerErrorCode,
    message: string,
    details?: any
  );
}

PlayerErrorCode

typescript
enum PlayerErrorCode {
  /** Generic unknown error */
  UNKNOWN = 'UNKNOWN',

  /** Network-related errors */
  NETWORK_ERROR = 'NETWORK_ERROR',
  NETWORK_TIMEOUT = 'NETWORK_TIMEOUT',
  NETWORK_ABORT = 'NETWORK_ABORT',

  /** Media format errors */
  MEDIA_FORMAT_ERROR = 'MEDIA_FORMAT_ERROR',
  MEDIA_DECODE_ERROR = 'MEDIA_DECODE_ERROR',
  MEDIA_UNSUPPORTED = 'MEDIA_UNSUPPORTED',

  /** Source errors */
  SOURCE_NOT_FOUND = 'SOURCE_NOT_FOUND',
  SOURCE_INVALID = 'SOURCE_INVALID',
  SOURCE_CORRUPTED = 'SOURCE_CORRUPTED',

  /** Player state errors */
  INVALID_STATE = 'INVALID_STATE',
  OPERATION_ABORTED = 'OPERATION_ABORTED',
  PERMISSION_DENIED = 'PERMISSION_DENIED',

  /** Track errors */
  TRACK_NOT_FOUND = 'TRACK_NOT_FOUND',
  TRACK_SWITCH_FAILED = 'TRACK_SWITCH_FAILED',

  /** Memory errors */
  OUT_OF_MEMORY = 'OUT_OF_MEMORY',
  MEMORY_LIMIT_EXCEEDED = 'MEMORY_LIMIT_EXCEEDED'
}

MediaError

typescript
interface MediaError extends Error {
  readonly code: number;
  readonly MEDIA_ERR_ABORTED: 1;
  readonly MEDIA_ERR_NETWORK: 2;
  readonly MEDIA_ERR_DECODE: 3;
  readonly MEDIA_ERR_SRC_NOT_SUPPORTED: 4;
}

Plugin Types

Plugin

typescript
interface Plugin {
  /** Plugin name */
  readonly name: string;

  /** Plugin version */
  readonly version: string;

  /** Initialize the plugin */
  init(player: MediaFox, options?: any): void | Promise<void>;

  /** Cleanup when plugin is destroyed */
  destroy?(): void | Promise<void>;
}

PluginOptions

typescript
interface PluginOptions {
  [key: string]: any;
}

Utility Types

TimeRanges

typescript
interface TimeRanges {
  readonly length: number;
  start(index: number): number;
  end(index: number): number;
}

CanvasPool

typescript
interface CanvasPool {
  getCanvas(width: number, height: number): HTMLCanvasElement;
  returnCanvas(canvas: HTMLCanvasElement): void;
  clear(): void;
}

VideoFrame

typescript
interface VideoFrame {
  readonly displayWidth: number;
  readonly displayHeight: number;
  readonly duration: number;
  readonly timestamp: number;
  readonly format: string;

  close(): void;
  clone(): VideoFrame;
}

AudioBuffer

typescript
interface AudioBuffer {
  readonly length: number;
  readonly duration: number;
  readonly sampleRate: number;
  readonly numberOfChannels: number;

  getChannelData(channel: number): Float32Array;
  copyFromChannel(
    destination: Float32Array,
    channelNumber: number,
    startInChannel?: number
  ): void;
  copyToChannel(
    source: Float32Array,
    channelNumber: number,
    startInChannel?: number
  ): void;
}

Generic Types

EventMap

typescript
type EventMap = Record<string, (...args: any[]) => void>;

Listener

typescript
type Listener<T extends EventMap, K extends keyof T> = T[K];

EventNames

typescript
type EventNames<T extends EventMap> = keyof T;

Parameters

typescript
type EventParameters<
  T extends EventMap,
  K extends keyof T
> = Parameters<T[K]>;

Type Guards

Source Type Guards

typescript
function isFile(source: SourceInput): source is File;
function isBlob(source: SourceInput): source is Blob;
function isMediaStream(source: SourceInput): source is MediaStream;
function isURL(source: SourceInput): source is string;
function isSourceConfig(source: SourceInput): source is SourceConfig;

Error Type Guards

typescript
function isPlayerError(error: Error): error is PlayerError;
function isMediaError(error: Error): error is MediaError;
function isNetworkError(error: Error): boolean;
function isDecodeError(error: Error): boolean;

Track Type Guards

typescript
function isVideoTrack(track: VideoTrack | AudioTrack): track is VideoTrack;
function isAudioTrack(track: VideoTrack | AudioTrack): track is AudioTrack;

Constants

Default Values

typescript
const DEFAULT_PLAYER_OPTIONS: Required<Omit<PlayerOptions, 'canvas'>> = {
  autoplay: false,
  muted: false,
  volume: 1,
  playbackRate: 1,
  frameBufferSize: 10,
  maxMemoryUsage: 100 * 1024 * 1024, // 100MB
  canvasPool: undefined,
  debug: false
};

const DEFAULT_STORE_OPTIONS: Required<StoreOptions> = {
  initialState: {},
  batchUpdates: true,
  batchInterval: 16, // ~60fps
  maxSubscribers: 100
};

Event Names

typescript
const PLAYER_EVENTS = [
  'play', 'pause', 'ended', 'seeking', 'seeked', 'timeupdate',
  'ratechange', 'loadstart', 'loadedmetadata', 'loadeddata',
  'canplay', 'canplaythrough', 'progress', 'waiting', 'stalled',
  'volumechange', 'error', 'tracksChanged', 'trackChanged',
  'sourceChanged', 'ready', 'destroy'
] as const;

type PlayerEventName = typeof PLAYER_EVENTS[number];

Module Declarations

Window Extensions

typescript
declare global {
  interface Window {
    MediaFox: typeof MediaFox;
  }
}

Canvas Extensions

typescript
declare module 'html-canvas-element' {
  interface HTMLCanvasElement {
    mediafoxPlayer?: MediaFox;
  }
}

This comprehensive type system provides full IntelliSense support and compile-time safety when using MediaFox with TypeScript.

MIT License