UNPKG

vidstack

Version:

Build awesome media experiences on the web.

111 lines (108 loc) 3.02 kB
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 };