snowplow/snowplow-javascript-tracker

View on GitHub
plugins/browser-plugin-media-tracking/src/contexts.ts

Summary

Maintainability
A
0 mins
Test Coverage
/*
 * Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import { TextTrack } from './types';

interface TimeRange {
  start: number;
  end: number;
}

export interface VideoElement {
  /**
   * A boolean value that is true if the video should enter or leave picture-in-picture mode automatically when changing tab and/or application
   **/
  autoPictureInPicture?: boolean | null;

  /**
   * The disablePictureInPicture property will hint the user agent to not suggest the picture-in-picture to users or to request it automatically
   **/
  disablePictureInPicture?: boolean | null;

  /**
   * 'poster' HTML attribute, which specifies an image to show while no video data is available
   **/
  poster?: string | null;

  /**
   * A value indicating the intrinsic height of the resource in CSS pixels, or 0 if no media is available yet
   **/
  videoHeight: number;

  /**
   * A value indicating the intrinsic width of the resource in CSS pixels, or 0 if no media is available yet
   **/
  videoWidth: number;
  [key: string]: unknown;
}

export interface MediaElement {
  /**
   * If playback should automatically begin as soon as enough media is available to do so without interruption
   **/
  autoPlay: boolean;

  /**
   * An array of time ranges that have been buffered
   **/
  buffered: TimeRange[];

  /**
   * If the user agent should provide it's own set of controls
   **/
  controls: boolean;

  /**
   * CORS settings value of the media player
   **/
  crossOrigin?: string | null;

  /**
   * The absolute URL of the media resource
   **/
  currentSrc: string;

  /**
   * If audio is muted by default
   **/
  defaultMuted: boolean;

  /**
   * The default media playback rate of the player
   **/
  defaultPlaybackRate: number;

  /**
   * If the media element is allowed to have a remote playback UI
   **/
  disableRemotePlayback?: boolean | null;

  /**
   * An object of the latest error to occur, or null if no errors
   **/
  error?: object | null;

  /**
   * The media file format
   **/
  fileExtension: string | null;

  /**
   * If the video element is fullscreen
   **/
  fullscreen?: boolean | null;

  /**
   * If the media is a video element, or audio
   **/
  mediaType: 'AUDIO' | 'VIDEO';

  /**
   * The current state of the fetching of media over the network
   **/
  networkState: 'NETWORK_EMPTY' | 'NETWORK_IDLE' | 'NETWORK_LOADING' | 'NETWORK_NO_SOURCE';

  /**
   * If the video element is showing Picture-In-Picture
   **/
  pictureInPicture?: boolean | null;

  /**
   * An array of time ranges played
   **/
  played?: TimeRange[];

  /**
   * The HTML id of the element
   **/
  htmlId: string;

  /**
   * The 'preload' HTML attribute of the media
   **/
  preload: string;

  /**
   * The readiness of the media
   **/
  readyState: 'HAVE_NOTHING' | 'HAVE_METADATA' | 'HAVE_CURRENT_DATA' | 'HAVE_FUTURE_DATA' | 'HAVE_ENOUGH_DATA';

  /**
   * Seekable time range(s)
   **/
  seekable: TimeRange[];

  /**
   * If the media is in the process of seeking to a new position
   **/
  seeking: boolean;

  /**
   * The 'src' HTML attribute of the media element
   **/
  src: string;

  /**
   * An array of TextTrack objects on the media element
   **/
  textTracks?: TextTrack[];
  [key: string]: unknown;
}

export interface MediaPlayerEvent {
  /**
   * The event fired by the media player
   **/
  type: string;

  /**
   * The custom media identifier given by the user
   **/
  mediaLabel?: string | null;
  [key: string]: unknown;
}

export interface MediaPlayer {
  /**
   * The current playback time
   **/
  currentTime: number;

  /**
   * A double-precision floating-point value indicating the duration of the media in seconds
   **/
  duration?: number | null;

  /**
   * If playback of the media has ended
   **/
  ended: boolean;

  /**
   * If the video should restart after ending
   **/
  loop: boolean;

  /**
   * If the media element is muted
   **/
  muted: boolean;

  /**
   * If the media element is paused
   **/
  paused: boolean;

  /**
   * The percent of the way through the media
   **/
  percentProgress?: number | null;

  /**
   * Playback rate (1 is normal)
   **/
  playbackRate: number;

  /**
   * Volume level
   **/
  volume: number;
  [key: string]: unknown;
}