vidstack
Version:
Build awesome media experiences on the web.
108 lines (105 loc) • 3.26 kB
JavaScript
import { isUndefined, isString, DOMEvent, isFunction } from 'maverick.js/std';
import { R as coerceToError, U as loadScript } from '../../media-core.js';
class HLSLibLoader {
constructor(_lib, _context, _callback) {
this._lib = _lib;
this._context = _context;
this._callback = _callback;
this._startLoading();
}
async _startLoading() {
this._context.logger?.info("\u{1F3D7}\uFE0F Loading HLS Library");
const callbacks = {
onLoadStart: this._onLoadStart.bind(this),
onLoaded: this._onLoaded.bind(this),
onLoadError: this._onLoadError.bind(this)
};
let ctor = await loadHLSScript(this._lib, callbacks);
if (isUndefined(ctor) && !isString(this._lib))
ctor = await importHLS(this._lib, callbacks);
if (!ctor)
return null;
if (!ctor.isSupported()) {
const message = "[vidstack]: `hls.js` is not supported in this environment";
this._context.logger?.error(message);
this._context.player.dispatchEvent(new DOMEvent("hls-unsupported"));
this._context.delegate._dispatch("error", { detail: { message, code: 4 } });
return null;
}
return ctor;
}
_onLoadStart() {
{
this._context.logger?.infoGroup("Starting to load `hls.js`").labelledLog("URL", this._lib).dispatch();
}
this._context.player.dispatchEvent(new DOMEvent("hls-lib-load-start"));
}
_onLoaded(ctor) {
{
this._context.logger?.infoGroup("Loaded `hls.js`").labelledLog("Library", this._lib).labelledLog("Constructor", ctor).dispatch();
}
this._context.player.dispatchEvent(
new DOMEvent("hls-lib-loaded", {
detail: ctor
})
);
this._callback(ctor);
}
_onLoadError(e) {
const error = coerceToError(e);
{
this._context.logger?.errorGroup("Failed to load `hls.js`").labelledLog("Library", this._lib).labelledLog("Error", e).dispatch();
}
this._context.player.dispatchEvent(
new DOMEvent("hls-lib-load-error", {
detail: error
})
);
this._context.delegate._dispatch("error", {
detail: { message: error.message, code: 4 }
});
}
}
async function importHLS(loader, callbacks = {}) {
if (isUndefined(loader))
return void 0;
callbacks.onLoadStart?.();
if (loader.prototype && loader.prototype !== Function) {
callbacks.onLoaded?.(loader);
return loader;
}
try {
const ctor = (await loader())?.default;
if (ctor && !!ctor.isSupported) {
callbacks.onLoaded?.(ctor);
} else {
throw Error(
true ? "[vidstack] failed importing `hls.js`. Dynamic import returned invalid constructor." : ""
);
}
return ctor;
} catch (err) {
callbacks.onLoadError?.(err);
}
return void 0;
}
async function loadHLSScript(src, callbacks = {}) {
if (!isString(src))
return void 0;
callbacks.onLoadStart?.();
try {
await loadScript(src);
if (!isFunction(window.Hls)) {
throw Error(
true ? "[vidstack] failed loading `hls.js`. Could not find a valid `Hls` constructor on window" : ""
);
}
const ctor = window.Hls;
callbacks.onLoaded?.(ctor);
return ctor;
} catch (err) {
callbacks.onLoadError?.(err);
}
return void 0;
}
export { HLSLibLoader as H };