4.1.2 • Published 19 days ago

@stormstreaming/stormlibrary v4.1.2

Weekly downloads
-
License
SEE LICENSE IN LI...
Repository
github
Last release
19 days ago

Storm JavaScript Library

Storm Library is a core web video player for embedding live-video streams on a website. It is a part of Storm Streaming Suite and requires Storm Streaming Server instance or Cloud subscription to work. This library contains only core network and media functionality and comes with no GUI (user interface), except for a video element. For a full-fledged video player with progress bars, buttons etc. please check Storm Player, which is a GUI wrapper for this project. It can be used as a sample code or ready-to-use component for a website.

This library comes in IIFE, ESM, AMD, UMD, and CJS versions (if you don't know these, grab IIFE, and it will be OK). Typings are now also included.

If you wish to test the library, check its API, look code snippets please visit our demo page: https://www.stormstreaming.com/demo/index.html

To get started check our examples and documentation at https://www.stormstreaming.com/docs/v2

Installation

  1. Using NPM:

npm install @stormstreaming/stormlibrary

  1. Using Yarn:

yarn add @stormstreaming/stormlibrary

  1. Manually - if you are clueless about NPM/Yarn or simply want to test it out, just grab/dist/iife/index.js file and embed it on your website.

Sample setup

  1. IIFE (Immediately-Invoked Function Expression).
<!doctype html>
<html lang="en">
<head>
    <title>Storm JavaScript Library - IIFE Sample page</title>
    <meta charset="UTF-8"/>
    <script src="dist/iife/index.js"></script>
</head>
<body>
<div id="videoHolder"></div>
<script>
    /**
     * Standard configuration object
     */
    const streamConfig = {
        configurationType: "gateway",                    // "embedded" or "gateway", please check doc for more info
        stream: {
            serverList: [                                // list of streaming server, 2nd, 3rd etc. will be used as backup
                {
                    host: "localhost",                   // host or ip to a storm streaming server instance
                    application: "live",                 // application name (can be configured in storm server settings)
                    port: 80,                            // server port, usually 80 (non-ssl) or 443 (ssl)
                    ssl: false                           // whenever SSL connection should be used or not
                }
            ],
            streamKey: "test"                             // streamkey
        },
        settings: {
            autoStart: true,                              // if set to true, video will start playing automatically, but will be muted too
            video: {
                containerID: "videoHolder",               // name of the HTML container
                aspectRatio: "16:9",                      // <video> element will scale to provided aspect-ratio. This parameter is optional and will overwrite "height" parameter as "width" will only be used for calculations
                width: "100%",                            // <video> element width, can be either "px" or "%" (string), as (number) will always be "px" value. For % it'll auto-scale to parent container,
            },
            debug: {
                console: {                                // console output
                    enabled: true                         // if console output is activated
                }
            }
        }
    };

    /**
     * Creating an instance of the storm library
     */
    const storm = stormLibrary(streamConfig);

    /**
     * Prior to initialization some event-listeners can be added
     */
    storm.initialize();

</script>
</body>
</html>
  1. UMD (Universal Module Definition).
<!doctype html>
<html lang="en">
  <head>
    <title>Storm JavaScript Player - UMD Sample page</title>
    <meta charset="UTF-8" />
    <script src="../dist/umd/index.js"></script>
  </head>
  <body>
    <div id="videoHolder"></div>
    <script>
      /**
       * Basic configuration object
       */
      const streamConfig = {
          configurationMode: "gateway",                    // "embedded" or "gateway", please check doc for more info
          stream: {
              serverList: [                                // list of streaming server, 2nd, 3rd etc. will be used as backup
                  {
                      host: "localhost",                   // host or ip to a storm streaming server instance
                      application: "live",                 // application name (can be configured in storm server settings)
                      port: 8080,                          // server port, usually 80 (non-ssl) or 443 (ssl)
                      ssl: false                           // whenever SSL connection should be used or not
                  }
              ],
              streamKey: "test"                            // streamkey
          },
          settings: {
              autoStart: true,                             // if true, video will start playing automatically, but will be muted too
              video: {
                  containerID: "videoHolder",              // name of the HTML container
                  aspectRatio: "16:9",                     // <video> element will scale to provided aspect-ratio. This parameter is optional and will overwrite "height" parameter as "width" will only be used for calculations
                  width: "100%",                           // <video> element width, can be either "px" or "%" (string), as (number) will always be "px" value. For % it'll auto-scale to parent container,
              },
              debug: {
                  console: {                               // console output
                      enabled: true                        // if console output is activated
                  }
              }
          }
      };

      /**
       * Creating an instance of the storm library
       */
      const storm = stormLibrary.create(streamConfig);

      /**
       * Prior to initialization some event-listeners can be added
       */
      storm.initialize();
      
    </script>
  </body>
</html>
  1. ESM (Universal Module Definition).
import { StormLibrary } from "../dist/esm/index.js";

/**
 * Basic configuration object
 */
const streamConfig = {
        configurationMode: "embedded",                   // "embedded" or "gateway", please check doc for more info
        stream: {
            serverList: [                                // list of streaming server, 2nd, 3rd etc. will be used as backup
                {
                    host: "localhost",                   // host or ip to a storm streaming server instance
                    application: "live",                 // application name (can be configured in storm server settings)
                    port: 8080,                          // server port, usually 80 (non-ssl) or 443 (ssl)
                    ssl: false                           // whenever SSL connection should be used or not
                }
            ],
            streamKey: "test"                             // streamkey
        },
        settings: {
            autoStart: true,                              // if true, video will start playing automatically, but will be muted too
            video: {
                containerID: "videoHolder",               // name of the HTML container
                aspectRatio: "16:9",                      // <video> element will scale to provided aspect-ratio. This parameter is optional and will overwrite "height" parameter as "width" will only be used for calculations
                width: "100%",                            // <video> element width, can be either "px" or "%" (string), as (number) will always be "px" value. For % it'll auto-scale to parent container, 
            },
            debug: {
                console: {                                // console output
                    enabled: true                         // if console output is activated
                }
            }
        }
    }
};


/**
 * Creating an instance of the storm library
 */
const storm = new StormLibrary(streamConfig);

/**
 * Prior to initialization some event-listeners can be added
 */
storm.initialize();
  1. AMD (Asynchronous Module Definition).
<!doctype html>
<html lang="en">
  <head>
    <title>Storm JavaScript Player - AMD Sample page</title>
    <meta charset="UTF-8" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
  </head>
  <body>
    <div id="videoHolder"></div>
    <script>

      /**
       * Basic configuration object
       */
      const streamConfig = {
          configurationMode: "embedded",                   // "embedded" or "gateway", please check doc for more info
          stream: {
              serverList: [                                // list of streaming server, 2nd, 3rd etc. will be used as backup
                  {
                      host: "localhost",                   // host or ip to a storm streaming server instance
                      application: "live",                 // application name (can be configured in storm server settings)
                      port: 8080,                          // server port, usually 80 (non-ssl) or 443 (ssl)
                      ssl: false                           // whenever SSL connection should be used or not
                  }
              ],
              streamKey: "test"                             // streamkey
          },
          settings: {
              autoStart: true,                              // if true, video will start playing automatically, but will be muted too
              video: {
                  containerID: "videoHolder",               // name of the HTML container
                  aspectRatio: "16:9",                      // <video> element will scale to provided aspect-ratio. This parameter is optional and will overwrite "height" parameter as "width" will only be used for calculations
                  width: "100%",                            // <video> element width, can be either "px" or "%" (string), as (number) will always be "px" value. For % it'll auto-scale to parent container,
              },
              debug: {
                  console: {                                // console output
                      enabled: true                         // if console output is activated
                  }
              }
          }
      };

      /**
       * Path to the AMD module
       */
      requirejs(['../dist/amd/index'], function (storm) {

          /**
           * Library instance
           */
           const player = new storm.create(streamConfig);
          
          /**
           * Prior to initialization some event-listeners can be added
           */
          player.initialize();

      });
    </script>
  </body>
</html>

Attaching and detaching events

/**
 * An event can be registered using addEventListener method (preferably before initialize() method is called)
 */
storm.addEventListener("playerCoreReady", onLibraryReady);

/**
 * Inline functions are fine too...
 */
storm.addEventListener("playerCoreReady", function(event){
    console.log("playerReady");
});

/**
 * An event can also be removed...
 */
storm.removeEventListener("playerCoreReady", onLibraryReady);

/**
 * All event listeners of that type can be removed like this
 */
storm.removeEventListener("playerCoreReady");

Sample event listeners

storm.addEventListener("playerCoreReady", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} is ready for interaction!`);
})

storm.addEventListener("serverConnectionInitiate", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Connection to: ${event.serverURL} has been initialized`);
})

storm.addEventListener("serverConnect", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Successfully connected to: ${event.serverURL}`);
})

storm.addEventListener("serverDisconnect", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Disconnected from: ${event.serverURL}`);
})

storm.addEventListener("serverConnectionError", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Could not connect to server: ${event.serverURL}`);
})

storm.addEventListener("allConnectionsFailed", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - All connections from server list failed`);
})

storm.addEventListener("streamStateChange", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Stream: ${event.streamKey} state has changed to: ${event.state}.`);
})

storm.addEventListener("streamNotFound", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - No stream for streamKey: ${event.streamKey}`);
})

storm.addEventListener("interactionRequired", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - User interaction is required!`);
})

storm.addEventListener("playbackInitiate", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Playback initiated for streamKey: ${event.streamKey}`);
})

storm.addEventListener("playbackStart", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Playback started for streamKey: ${event.streamKey}`);
})

storm.addEventListener("playbackPause", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Playback paused for streamKey: ${event.streamKey}`);
})

storm.addEventListener("streamStop", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Stream has stopped`);
})

storm.addEventListener("volumeChange", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Volumed changed, new value: ${event.volume}`);
    console.log(`-->: is muted: ${event.muted}`);
    console.log(`-->: invoked by: ${event.invokedBy}`);
})

storm.addEventListener("playbackProgress", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Progress event`);
    console.log(`-->: playback duration: ${event.playbackDuration}`);
    console.log(`-->: playback start time: ${event.playbackStartTime}`);
    console.log(`-->: stream total duration: ${event.streamDuration}`);
    console.log(`-->: stream start time: ${event.streamStartTime}`);
    console.log(`-->: dvr cache size: ${event.dvrCacheSize}`);
})

storm.addEventListener("metadataReceived", function(event){
    console.log(`Library ID: ${event.ref.getLibraryID()} - Metadata arrived`);
    console.log(`-->: video-codec: ${event.metadata.getVideoCodec()}`);
    console.log(`-->: audio-codec: ${event.metadata.getAudioCodec()}`);
    console.log(`-->: video width: ${event.metadata.getVideoWidth()}`);
    console.log(`-->: video height: ${event.metadata.getVideoHeight()}`);
    console.log(`-->: fps: ${event.metadata.getNominalFPS()}`);
    console.log(`-->: encoder: ${event.metadata.getEncoder()}`);
})

Library Event List

Event nameAdditional dataDescriptionCan be fired more than once
serverConnectionInitiateserverURL:stringThis event is fired when a library instance initiates a connection with a Storm Streaming Server/Cloud instance.yes (once per connection)
serverConnectserverURL:stringThis event is triggered when a library instance successfully establishes a connection with a Storm Streaming Server/Cloud instance.yes (once per connection)
serverDisconnectserverURL:stringThis event is called when a library instance is disconnected from the Storm Streaming Server/Cloud (after a connection was previously established), which may occur due to viewer networking issues or Storm Streaming Server/Cloud problems.yes (once per connection)
serverConnectionErrorserverURL:stringThis event is triggered when a library instance fails to establish a connection with a Storm Streaming Server/Cloud instance, possibly due to networking issues. If there are additional servers on the configuration list and the "restartOnError" parameter is set to true, the library will attempt to connect to a different server instead.yes (once per connection)
allConnectionsFailednoThis event is associated with serverConnectionError. If a library instance is unable to connect to any of the servers provided in the configuration list, this event indicates that no further action can be taken.no
playerCoreReadynoThis event is called when a library instance is prepared to accept API calls (using different methods). No playback-related methods should be invoked on the library before this event is registered.no
compatibilityErrornoThis event is triggered if a browser or device does not support any of the provided sources. Please note that the library will attempt all possible measures (switching between various modes) to ensure maximum compatibility with a given device. However, there may be instances where it is simply impossible to initiate a video.yes
interactionRequirednoCertain browsers and devices do not permit a video element to initiate on its own and necessitate direct user interaction, such as a mouse click or a touch gesture. This event signifies that such an engagement is required.no
SSLErrornoIf an SSL layer is required for specific sources and the browser does not provide it, this event will be triggered.no
videoElementCreateyes (videoObject)This event is triggered whenever a video element within a library instance is either created or recreated.no
streamSourceAddISourceItemThis event is activated whenever a new video source is added to the library (check addSourceItem in the API section).yes
authorizationErrornoThis event is fired when a library instance fails to authorize with a server application on Storm Streaming Server/Cloud instance (e.g. incorrect token)yes
authorizationCompletenoThis event is called when a library instance successfully authorizes with a server application on Storm Streaming Server/Cloud instance.yes
invalidLicensenoWhenever a Storm Streaming Server/Cloud license expires, a library instance will fire this event.no
streamConfigChangeStormStreamConfigThis event notifies that basic stream configuration has been updated.yes

Playback Event List

Event nameAdditional dataDescriptionCan be fired more than once
playbackInitiatenoThis event is fired whenever a playback of a stream is initiated (e.g. either due to autoStart set to true or user interaction).yes (once per video)
playbackStartnoThis event notifies that video playback has started (video is now playing)yes
playbackPausenoThis event notifies that video playback has been paused (due to end-user or system interaction)yes
playbackProgressplaybackStarTime:number, playbackDuration:number, streamStartTime:number, streamDuration:number, dvrCacheSize:numberEvent informs on video progress, stream/playback start-time, stream/playback duration and nDVR cache size.yes
streamStateChangestate: "AWAITING" / "NOT_PUBLISHED" / "UNPUBLISHED" / "PUBLISHED" / "CLOSED" / "UNKNOWN"This event notifies that stream state has changed.yes
streamStopnoEvent will be called when the stream is closed on the server side (usually it means that the broadcaster has stopped streaming, or stream was unpublished).yes
streamNotFoundnoThis event is called whenever a stream with a specific name was not found on the server (this includes hibernated streams or sub-streams).yes (once per video)
metadataReceivedStormMetaDataItemThis event informs of metadata arrival for current video. MetaData contains information about stream codecs, width, height, bitrate etc.yes
bufferingStartnoThis event indicates a video content is being readied for playback. The video buffer must fill in order for the video to start.yes
bufferingCompletenoThis event indicates that the buffer is full and playback is ready to start.yes
volumeChangevolume:number, muted:boolean, invokedBy: user/browserThis event notifies that video volume was changed (either its value was changed, or video was muted/un-muted).yes
playbackErrornoEvent indicates that there was a problem with the playback (it usually means that the browser was not able to play a source material due to malformed bitcode).yes (once per video)
fullScreenEnternoThis event is fired whenever a library instance enters browser fullscreen mode (either native or overlay type)yes
fullScreenExitnoThis event is fired whenever a library instance exits fullscreen mode (either native or overlay type)yes

API

MethodReturnsReturn typeDescription
initialize()-voidActivates all scripts within a library instance. All event-listeners should be already attached to the library.
isInitialized()true if this library instance was already initializedbooleanReturns true if this library instance has already been initialized.
isConnected()true if this library instance is connected to a serverbooleanReturns true if this library instance is connected to a server.
isAuthorized()true if this library instance is authorized with a serverbooleanReturns true if this library instance is authorized with a server.
getLibraryID()Library ID (first instance starts with 0, next one gets 1, etc.)numberThis method returns library's ID.
getRole()player or streamerstringThis method returns whether the library is working in the player or streamer mode (the streamer function has not been implemented yet).
getVersion()Library version in xx.xx.xx formatstringThis method returns library version.
play()-voidThis method will initiate playback of a video stream. If a video was paused or stopped previously, you can use this method to resume playback.
pause()-voidThis method pauses current playback.
stop()-voidThis method will stop the current playback and cease all operations. It'll also disconnect library from a server.
restart()-voidThe library is restarted to the default state (a combination of stop() and start() methods).
togglePlay()-voidThis method will work as a pause/play switch depending on the current object state.
isPlaying()true if playback is active.booleanReturns true/false depending on current library state. Please check getPlaybackState() for more detailed information.
getPlaybackState()"NOT_INITIALIZED", "INITIALIZED", "PLAYING", "PAUSED", "BUFFERING", "STOPPED", "UNKNOWN"stringReturns current library playback state.
getStreamState()"AWAITING", "NOT_PUBLISHED", "UNPUBLISHED", "PUBLISHED", "CLOSED", "UNKNOWN"stringReturns current stream state.
seek(time:number)-voidSeeks stream to a given time (stream source timestamp).
mute()-voidMutes the library’s video object. It’s not the same as setVolume(0), as both methods can be applied together.
unmute()-voidThe method unmutes the library’s video object.
toggleMute()-voidSwitches mute on/off.
isMute()true if the library is mutedbooleanThis method can be used to check whether the library is muted.
setVolume(newVolume:number)-voidSets new volume for the library (0-100). Once the method is performed volumeChange event will be triggered.
getVolume()Current volume level 0-100numberReturns library volume (0-100).
setSize(width:number/string, height:number/string)-voidThe method sets a new width and height for the video element. The values can be given as a number (in which case they are treated as the number of pixels), or as a string ending with "px" (this will also be the number of pixels) or "%", where the number is treated as a percentage of the parent container's value.
setWidth(width:number/string)-voidThe method sets a new width for the video element. The value can be given as a number (in which case it is treated as the number of pixels), or as a string ending with "px" (this will also be the number of pixels) or "%", where the number is treated as a percentage of the parent container's value.
getWidth()Video object widthnumberReturns main Video Object width in pixels.
setHeight(height:number/string)-voidThe method sets a new height for the video element. The value can be given as a number (in which case it is treated as the number of pixels), or as a string ending with "px" (this will also be the number of pixels) or "%", where the number is treated as a percentage of the parent container's value.
getHeight()Video object heightnumberReturns main Video Object height in pixels.
setScalingMode(newMode:string)-voidChanges library scaling mode. For reference, please check scaling mode in the library config.
getScalingMode()Current scaling modestringReturns current library scaling mode. For reference, please check scaling mode in the library config.
setStreamConfig(config:StormStreamConfig)-voidSets stream config for the library (or overwrites an existing one)
getStreamConfig()Storm Streaming Configuration objectStormStreamingConfigReturns current config for the library
destroy()-voidDestroys the library instance and removes it from the container.
addEventListener(eventName:string, callback:function, removable:boolean = true)-voidRegisters an event with a library instance. Whenever a registered event occurs, the library will call a provided function.
removeEventListener(eventName:string, callback:function)-voidRemoves event listener from the library. If callback is not provided all events of that type will be removed.
removeAllEventListeners()-voidRemoves all removable event listener from the library.
getSourceList()Array containing available sourcesISourceItem[]Returns an array of all available source items.
removeAllSources()-voidRemoves all SourceItems from a library instance. This method however will not stop current playback.
subscribe(streamKey:string, andPlay:boolean)-voidThis method will create a new request to a Storm Streaming Server/Cloud instance and pull all related SourceItems into the library. Second parameter decides if playback will start automatically.
playSource(sourceItem:ISourceItem)-voidThis method will start a playback of a provided Stream Source Item.
getCurrentSourceItem()ISourceItem object or nullISourceItem / nullReturns current source item. If no source was selected yet, null might be returned instead.
addSourceItem(sourceItem:SourceItem, addAndPlay:boolean)-voidAdd new stream object to the library. It can also start playing it automatically.
enterFullScreen()-voidEnters the FullScreen mode.
exitFullScreen()-voidExits the FullScreen mode.
isFullScreenMode()true if the library is in FullScreen modevoidReturns true/false whenever a library instance is in the FullScreen mode.
getAbsoluteStreamTime()UnixtimenumberReturns current playback time.
getVideoElement()Reference to the main Video ElementHTMLVideoElementReturns Video Element used by this library instance.

Browser compatibility

  • Edge 12+
  • Chrome 31+
  • Firefox 42+
  • Safari 13+
  • Opera 15+

For legacy browsers, HLS mode is used instead.

Resources

License

4.1.2

19 days ago

4.1.1

27 days ago

4.1.0

30 days ago

4.0.5

1 month ago

4.0.4

1 month ago

4.0.3

2 months ago

4.0.1

3 months ago

4.0.0

3 months ago

4.0.0-rc.1

4 months ago

4.0.0-rc.0

4 months ago

4.0.0-beta.10

5 months ago

4.0.0-beta.9

5 months ago

4.0.0-beta.6

5 months ago

4.0.0-alpha.9

5 months ago

4.0.0-alpha.7

6 months ago

4.0.0-alpha.8

5 months ago

4.0.0-alpha.5

6 months ago

4.0.0-alpha.6

6 months ago

3.0.0-alpha.1

9 months ago

3.0.0-alpha.0

9 months ago

3.0.0-alpha.3

9 months ago

3.0.0-alpha.2

9 months ago

3.0.0-alpha.5

9 months ago

3.0.0-alpha.4

9 months ago

4.0.0-alpha.3

6 months ago

4.0.0-alpha.4

6 months ago

4.0.0-alpha.1

6 months ago

4.0.0-alpha.2

6 months ago

4.0.0-alpha.0

6 months ago

3.0.0-beta.10

10 months ago

3.0.0-beta.11

10 months ago

3.0.0-beta.12

9 months ago

3.0.0-beta.13

9 months ago

3.0.0-beta.14

9 months ago

3.0.0-beta.1

10 months ago

3.0.0-beta.0

10 months ago

3.0.0-beta.3

10 months ago

3.0.0-beta.2

10 months ago

3.0.0-beta.5

10 months ago

3.0.0-beta.4

10 months ago

3.0.0-beta.7

10 months ago

3.0.0-beta.6

10 months ago

3.0.0-beta.9

10 months ago

3.0.0-beta.8

10 months ago

3.0.0-rc.13

8 months ago

3.0.0-rc.12

8 months ago

3.0.0-rc.14

8 months ago

4.0.0-beta.0

5 months ago

3.0.0-rc.2

9 months ago

3.0.0-rc.1

9 months ago

3.0.0-rc.6

9 months ago

3.0.0-rc.5

9 months ago

3.0.0-rc.11

8 months ago

3.0.0-rc.4

9 months ago

3.0.0-rc.10

8 months ago

3.0.0-rc.3

9 months ago

3.0.0-rc.9

9 months ago

3.0.0-rc.8

9 months ago

3.0.0-rc.7

9 months ago

2.3.0-beta.0

10 months ago

2.2.3

2 years ago

2.2.2

2 years ago

2.2.1

2 years ago

2.1.2

2 years ago

2.2.0

2 years ago

2.1.4

2 years ago

2.1.3

2 years ago

2.1.0

2 years ago

2.0.1

2 years ago

2.0.0-beta.4

2 years ago

2.0.0

2 years ago

2.0.0-beta.3

2 years ago

2.0.0-beta.2

2 years ago

2.0.0-beta.1

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago

1.1.0

3 years ago

1.0.0

3 years ago

0.9.3

3 years ago

0.9.2

3 years ago