
Security News
/Research
Wallet-Draining npm Package Impersonates Nodemailer to Hijack Crypto Transactions
Malicious npm package impersonates Nodemailer and drains wallets by hijacking crypto transactions across multiple blockchains.
@100mslive/hls-player
Advanced tools
HLS client library which uses HTML5 Video element and Media Source Extension for playback
The HMSHLSPlayer
is an HLS player offered by 100ms that can be used to play HLS streams. The player takes a URL and video element to play the stream.
You can use Node package manager or yarn to add HMSHLSPlayer sdk to your project. Use @100mslive/hls-player as the package source.
npm i @100mslive/hls-player
Below shows all the methods exposed from player
interface IHMSHLSPlayer {
/**
* @returns get html video element
*/
getVideoElement(): HTMLVideoElement;
/**
* set video volumne
* @param { volume } - in range [0,100]
*/
setVolume(volume: number): void;
/**
*
* @returns returns HMSHLSLayer which represents current
* quality.
*/
getLayer(): HMSHLSLayer | null;
/**
*
* @param { HMSHLSLayer } layer - layer we want to set the stream to.
* set { height: auto } to set the layer to auto
*/
setLayer(layer: HMSHLSLayer): void;
/**
* move the video to Live
*/
seekToLivePosition(): Promise<void>;
/**
* play stream
* call this when autoplay error is received
*/
play(): Promise<void>;
/**
* pause stream
*/
pause(): void;
/**
* It will update the video element current time
* @param seekValue Pass currentTime in second
*/
seekTo(seekValue: number): void;
}
You create an instance of HMSHLSPlayer like below:
import { HMSHLSPlayer } from '@100mslive/hls-player';
// hls url should be provided which player will run.
// second parameter is optional, if you had video element then pass to player else we will create one.
const hlsPlayer = new HMSHLSPlayer(hlsURL, videoEl)
// if video element is not present, we will create a new video element which can be attached to your ui.
const videoEl = hlsPlayer.getVideoElement();
You call play/pause on the hlsPlayer instance like below:
// return Promise<void>
hmsPlayer.play()
hmsPlayer.pause()
You use seekTo
methods on the hlsPlayer to seek to any position in video, below is given example:
// seekValue Pass currentTime in second
hmsPlayer.seekTo(5)
You use seekToLivePosition
methods on the hlsPlayer instance to go to the live poition like below:
hmsPlayer.seekToLivePosition()
Use volume property to change the volume of HLS player. The volume level is between 0-100. Volume is set to 100 by default.
hlsPlayer.setVolume(50);
/**
*
* @returns returns HMSHLSLayer which represents current
* quality.
*/
hlsPlayer.getLayer(): HMSHLSLayer | null;
/**
*
* @param { HMSHLSLayer } layer - layer we want to set the stream to.
* set { height: auto } to set the layer to auto
*/
hlsPlayer.setLayer(layer: HMSHLSLayer): void;
// quality interface
interface HMSHLSLayer {
readonly bitrate: number;
readonly height?: number;
readonly id?: number;
readonly width?: number;
url: string;
resolution?: string;
}
We are exposing events from our hls player.
enum HMSHLSPlayerEvents {
TIMED_METADATA_LOADED = 'timed-metadata',
SEEK_POS_BEHIND_LIVE_EDGE = 'seek-pos-behind-live-edge',
CURRENT_TIME = 'current-time',
AUTOPLAY_BLOCKED = 'autoplay-blocked',
MANIFEST_LOADED = 'manifest-loaded',
LAYER_UPDATED = 'layer-updated',
ERROR = 'error',
PLAYBACK_STATE = 'playback-state',
STATS = 'stats',
}
enum HLSPlaybackState {
playing,
paused,
}
interface HMSHLSPlaybackState {
state: HLSPlaybackState;
}
hlsPlayer.on(HMSHLSPlayerEvents.PLAYBACK_STATE, (event: HMSHLSPlayerEvents, data: HMSHLSPlaybackState): void => {});
interface HlsPlayerStats {
/** Estimated bandwidth in bits/sec. Could be used to show connection speed. */
bandwidthEstimate?: number;
/** The bitrate of the current level that is playing. Given in bits/sec */
bitrate?: number;
/** the amount of video available in forward buffer. Given in ms */
bufferedDuration?: number;
/** how far is the current playback from live edge.*/
distanceFromLive?: number;
/** total Frames dropped since started watching the stream. */
droppedFrames?: number;
/** the m3u8 url of the current level that is being played */
url?: string;
/** the resolution of the level of the video that is being played */
videoSize?: {
height: number;
width: number;
};
}
hlsPlayer.on(HMSHLSPlayerEvents.STATS, (event: HMSHLSPlayerEvents, data: HlsPlayerStats): void => {});
Hls player will provide a manifest which will provide a data like different quality layer once url is loaded.
interface HMSHLSManifestLoaded {
layers: HMSHLSLayer[];
}
hlsPlayer.on(HMSHLSPlayerEvents.MANIFEST_LOADED, (event: HMSHLSPlayerEvents, data: HMSHLSManifestLoaded): void => {});
interface HMSHLSLayerUpdated {
layer: HMSHLSLayer;
}
hlsPlayer.on(HMSHLSPlayerEvents.LAYER_UPDATED, (event: HMSHLSPlayerEvents, data: HMSHLSLayerUpdated): void => {});
Player will let you know if player is plaaying video live or not
interface HMSHLSStreamLive {
isLive: boolean;
}
hlsPlayer.on(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, (event: HMSHLSPlayerEvents, data: HMSHLSStreamLive): void => {});
HLS player will parse and send the timed-metadata.
interface HMSHLSCue {
id?: string;
payload: string;
duration: number;
startDate: Date;
endDate?: Date;
}
hlsPlayer.on(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, (event: HMSHLSPlayerEvents, data: HMSHLSCue): void => {});
interface HMSHLSException {
name: string,
message: string,
description: string,
isTerminal: boolean, // decide if player error will automatically restart(if false)
}
hlsPlayer.on(HMSHLSPlayerEvents.ERROR, (event: HMSHLSPlayerEvents, data: HMSHLSException): void => {});
hlsPlayer.on(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, (event: HMSHLSPlayerEvents, data: HMSHLSException): void => {});
hlsPlayer.on(HMSHLSPlayerEvents.CURRENT_TIME, (event: HMSHLSPlayerEvents, data: number): void => {});
Below are the simple example of how to use hls player's event
const isPlaying = false;
const playbackEventHandler = data => isPlaying = data.state === HLSPlaybackState.paused;
hlsPlayer.on(HMSHLSPlayerEvents.PLAYBACK_STATE, playbackEventHandler);
Below is a simple example in which hls-player will be used in your app.
// Vanilla JavaScript Example
import { HLSPlaybackState, HMSHLSPlayer, HMSHLSPlayerEvents } from "@100mslive/hls-player";
const videoEl; // reference for video element
const hlsUrl; // reference to hls url
// variable to handle ui and take some actions
let isLive = true, isPaused = false, isAutoBlockedPaused = false;
const handleError = data => console.error("[HLSView] error in hls", data);
const handleNoLongerLive = ({ isLive }) => isLive = isLive;
const playbackEventHandler = data => isPaused = (data.state === HLSPlaybackState.paused);
const handleAutoplayBlock = data => isAutoBlockedPaused = !!data;
const hlsPlayer = new HMSHLSPlayer(hlsUrl, videoEl);
hlsPlayer.on(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, handleNoLongerLive);
hlsPlayer.on(HMSHLSPlayerEvents.ERROR, handleError);
hlsPlayer.on(HMSHLSPlayerEvents.PLAYBACK_STATE, playbackEventHandler);
hlsPlayer.on(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, handleAutoplayBlock);
// React Example
import { HLSPlaybackState, HMSHLSPlayer, HMSHLSPlayerEvents } from "@100mslive/hls-player";
import { useEffect, useState } from 'react';
const videoEl; // reference for video element
const hlsUrl; // reference to hls url
// variable to handle ui and take some actions
const [isVideoLive, setIsVideoLive] = useState(true);
const [isHlsAutoplayBlocked, setIsHlsAutoplayBlocked] = useState(false);
const [isPaused, setIsPaused] = useState(false);
useEffect(() => {
const handleError = data => console.error("[HLSView] error in hls", data);
const handleNoLongerLive = ({ isLive }) => {
setIsVideoLive(isLive);
};
const playbackEventHandler = data =>
setIsPaused(data.state === HLSPlaybackState.paused);
const handleAutoplayBlock = data => setIsHlsAutoplayBlocked(!!data);
const hlsPlayer = new HMSHLSPlayer(hlsUrl, videoEl);
hlsPlayer.on(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, handleNoLongerLive);
hlsPlayer.on(HMSHLSPlayerEvents.ERROR, handleError);
hlsPlayer.on(HMSHLSPlayerEvents.PLAYBACK_STATE, playbackEventHandler);
hlsPlayer.on(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, handleAutoplayBlock);
return () => {
hlsPlayer.off(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, handleNoLongerLive);
hlsPlayer.off(HMSHLSPlayerEvents.ERROR, handleError);
hlsPlayer.off(HMSHLSPlayerEvents.PLAYBACK_STATE, playbackEventHandler);
hlsPlayer.off(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, handleAutoplayBlock);
}
}, []);
FAQs
HLS client library which uses HTML5 Video element and Media Source Extension for playback
The npm package @100mslive/hls-player receives a total of 679 weekly downloads. As such, @100mslive/hls-player popularity was classified as not popular.
We found that @100mslive/hls-player demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 17 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
/Research
Malicious npm package impersonates Nodemailer and drains wallets by hijacking crypto transactions across multiple blockchains.
Security News
This episode explores the hard problem of reachability analysis, from static analysis limits to handling dynamic languages and massive dependency trees.
Security News
/Research
Malicious Nx npm versions stole secrets and wallet info using AI CLI tools; Socket’s AI scanner detected the supply chain attack and flagged the malware.