vidstack
Version:
Build awesome media experiences on the web.
111 lines (108 loc) • 3.02 kB
JavaScript
import { peek } from 'maverick.js';
import { isString } from 'maverick.js/std';
import { W as isHLSSupported, p as preconnect } from '../../media-core.js';
import { VideoProvider } from '../video/provider.js';
import { H as HLSController } from './hls.js';
import { H as HLSLibLoader } from './lib-loader.js';
import 'maverick.js/element';
import '../type-check.js';
import '../audio/loader.js';
import 'maverick.js/dom';
import './loader.js';
import '../video/loader.js';
import '../html/provider.js';
import '../html/html–media-events.js';
import '../../media-ui.js';
import '../../icons/icon.js';
import 'media-captions';
import '../html/native-audio-tracks.js';
import '../video/native-hls-text-tracks.js';
import '../video/picture-in-picture.js';
import '../video/presentation/video-presentation.js';
const JS_DELIVR_CDN = "https://cdn.jsdelivr.net";
class HLSProvider extends VideoProvider {
$$PROVIDER_TYPE = "HLS";
_ctor = null;
_controller = new HLSController(this.video);
/**
* The `hls.js` constructor.
*/
get ctor() {
return this._ctor;
}
/**
* The current `hls.js` instance.
*/
get instance() {
return this._controller.instance;
}
/**
* Whether `hls.js` is supported in this environment.
*/
static supported = isHLSSupported();
get type() {
return "hls";
}
get canLiveSync() {
return true;
}
_library = `${JS_DELIVR_CDN}/npm/hls.js@^1.0.0/dist/hls${".js" }`;
/**
* The `hls.js` configuration object.
*
* @see {@link https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning}
*/
get config() {
return this._controller._config;
}
set config(config) {
this._controller._config = config;
}
/**
* The `hls.js` constructor (supports dynamic imports) or a URL of where it can be found.
*
* @defaultValue `https://cdn.jsdelivr.net/npm/hls.js@^1.0.0/dist/hls.min.js`
*/
get library() {
return this._library;
}
set library(library) {
this._library = library;
}
preconnect() {
if (!isString(this._library))
return;
preconnect(this._library);
}
setup(context) {
super.setup(context);
new HLSLibLoader(this._library, context, (ctor) => {
this._ctor = ctor;
this._controller.setup(ctor, context);
context.delegate._dispatch("provider-setup", { detail: this });
const src = peek(context.$store.source);
if (src)
this.loadSource(src);
});
}
async loadSource({ src }) {
if (!isString(src))
return;
this._controller.instance?.loadSource(src);
}
/**
* The given callback is invoked when a new `hls.js` instance is created and right before it's
* attached to media.
*/
onInstance(callback) {
const instance = this._controller.instance;
if (instance)
callback(instance);
this._controller._callbacks.add(callback);
return () => this._controller._callbacks.delete(callback);
}
destroy() {
this._controller._destroy();
}
}
export { HLSProvider };