UNPKG

@videojs/core

Version:

Core components and utilities for Video.js

139 lines (136 loc) 3.92 kB
import Hls from "hls.js"; //#region src/media/engine/hls-engine.ts var HlsPlaybackEngine = class extends EventTarget { constructor() { super(); } get src() { return this._hlsInstance?.url ?? void 0; } set src(src) { if (this.src === src) return; if (!this._hlsInstance) this._createHlsInstance(); if (!this.src && src) this._hlsInstance?.loadSource(src); } get element() { return this.mediaElement; } set element(val) { if (this.element === val) return; /** @TODO programmatic type checking? (CJP) */ this.mediaElement = val; } get mediaElement() { return this._hlsInstance?.media ?? void 0; } set mediaElement(val) { if (this.mediaElement === val) return; if (!this._hlsInstance) this._createHlsInstance(); if (!this.mediaElement && val) this._hlsInstance?.attachMedia(val); } _createHlsInstance() { this._hlsInstance = new Hls(); } _destroyHlsInstance() { this._hlsInstance?.destroy(); this._hlsInstance = void 0; } destroy() { this._destroyHlsInstance(); } }; const createHlsPlaybackEngine = () => new HlsPlaybackEngine(); //#endregion //#region src/media/playable.ts /** @TODO Split out "playable" vs. "audible" vs. "temporal" and compose via factory (current mixin pattern or spreadable mixin pattern) (CJP) */ const Events = [ "volumechange", "pause", "play", "playing", "emptied", "loadedmetadata", "timeupdate", "durationchange" ]; var MediaPlaybackController = class extends EventTarget { constructor() { super(); this._playbackEngine = createHlsPlaybackEngine(); } get mediaElement() { return this._playbackEngine.mediaElement; } set mediaElement(value) { if (this.mediaElement === value) return; if (this.mediaElement != null) Events.forEach((eventType) => { this.mediaElement?.removeEventListener(eventType, this); }); this._playbackEngine.mediaElement = value; if (this.mediaElement) Events.forEach((eventType) => { this.mediaElement?.addEventListener(eventType, this); }); } get paused() { return this.mediaElement?.paused ?? false; } pause() { /** @TODO implement deferred state etc. for cases where media has yet to be set */ if (!this.mediaElement) return; return this.mediaElement.pause(); } play() { /** @TODO implement deferred state etc. for cases where media has yet to be set */ if (!this.mediaElement) throw new Error("No media element is set"); return this.mediaElement.play(); } get muted() { return this.mediaElement?.muted ?? false; } set muted(value) { if (value === this.muted) return; /** @TODO implement deferred state etc. for cases where media has yet to be set */ if (!this.mediaElement) return; this.mediaElement.muted = value; } get volume() { return this.mediaElement?.volume ?? 0; } set volume(value) { if (value === this.volume) return; /** @TODO implement deferred state etc. for cases where media has yet to be set */ if (!this.mediaElement) return; this.mediaElement.volume = value; } get duration() { return this.mediaElement?.duration ?? 0; } get currentTime() { return this.mediaElement?.currentTime ?? 0; } set currentTime(value) { if (value === this.currentTime) return; /** @TODO implement deferred state etc. for cases where media has yet to be set */ if (!this.mediaElement) return; this.mediaElement.currentTime = value; } get src() { return this._playbackEngine.src ?? ""; } set src(value) { this._playbackEngine.src = value; } handleEvent(event) { if (event.target === this.mediaElement) { const clonedEvent = new event.constructor(event.type, event); this.dispatchEvent(clonedEvent); } } destroy() { this._playbackEngine.destroy(); } }; const createMediaPlaybackController = () => new MediaPlaybackController(); //#endregion export { Events, HlsPlaybackEngine, MediaPlaybackController, createHlsPlaybackEngine, createMediaPlaybackController }; //# sourceMappingURL=media.js.map