Files
shaka-player/lib/util/media_ready_state_utils.js
T
Joey Parrish 698d4e5694 fix: Fix load-time exception in nodejs
It is sometimes useful to load Shaka Player in nodejs, particularly a
debug build, to access some internal part of Shaka Player in a nodejs
script.  For example, I am currently working on an MP4 box
transformation for Shaka, but I am doing the R&D in node on the
command line rather than in a browser.

For this setup to work, Shaka should not refer to browser-specific
classes and APIs at load-time.  Thankfully, shaka.util.Lazy gives us
an easy way to lazy-load those things so that they are not needed at
load-time at all.

This change uses shaka.util.Lazy to defer a reference to
HTMLMediaElement in shaka.util.MediaReadyState.

Tangentially related to #2759

Change-Id: I376d2a81cb45e7cbc94be0a88deab3abb08001bf
2021-01-14 17:05:54 +00:00

44 lines
1.3 KiB
JavaScript

/*! @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
goog.provide('shaka.util.MediaReadyState');
goog.require('shaka.util.EventManager');
goog.require('shaka.util.Lazy');
shaka.util.MediaReadyState = class {
/**
* @param {!HTMLMediaElement} mediaElement
* @param {number} readyState
* @param {shaka.util.EventManager} eventManager
* @param {function()} callback
*/
static waitForReadyState(mediaElement, readyState, eventManager, callback) {
if (readyState == HTMLMediaElement.HAVE_NOTHING ||
mediaElement.readyState >= readyState) {
callback();
} else {
const MediaReadyState = shaka.util.MediaReadyState;
const eventName =
MediaReadyState.READY_STATES_TO_EVENT_NAMES_.value().get(readyState);
eventManager.listenOnce(mediaElement, eventName, callback);
}
}
};
/**
* @const {!shaka.util.Lazy.<!Map.<number, string>>}
* @private
*/
shaka.util.MediaReadyState.READY_STATES_TO_EVENT_NAMES_ =
new shaka.util.Lazy(() => new Map([
[HTMLMediaElement.HAVE_METADATA, 'loadedmetadata'],
[HTMLMediaElement.HAVE_CURRENT_DATA, 'loadeddata'],
[HTMLMediaElement.HAVE_FUTURE_DATA, 'canplay'],
[HTMLMediaElement.HAVE_ENOUGH_DATA, 'canplaythrough'],
]));