@vime/core
Version:
Customizable, extensible, accessible and framework agnostic media player.
132 lines (127 loc) • 4.69 kB
JavaScript
import { g as getElement, w as writeTask } from './index-f5fd0f81.js';
import { d as isInstanceOf, j as createStencilHook, l as listen, D as Disposal } from './withComponentRegistry-28311671.js';
import { P as Provider } from './Provider-2e7e8366.js';
import { a as isWritableProp } from './PlayerProps-2c57fcea.js';
const PROVIDER_CHANGE_EVENT = 'vmProviderChange';
/**
* Creates a dispatcher on the given `ref`, to send updates to the closest ancestor player via
* the custom `vmProviderChange` event.
*
* @param ref A component reference to dispatch the state change events from.
*/
const createProviderDispatcher = (ref) => (prop, value) => {
const el = isInstanceOf(ref, HTMLElement) ? ref : getElement(ref);
const event = new CustomEvent(PROVIDER_CHANGE_EVENT, {
bubbles: true,
composed: true,
detail: { by: el, prop, value },
});
el.dispatchEvent(event);
};
const providerWritableProps = new Set([
'ready',
'playing',
'playbackReady',
'playbackStarted',
'playbackEnded',
'seeking',
'buffered',
'buffering',
'duration',
'viewType',
'mediaTitle',
'mediaType',
'currentSrc',
'currentPoster',
'playbackRates',
'playbackQualities',
'textTracks',
'currentTextTrack',
'isTextTrackVisible',
'audioTracks',
'currentAudioTrack',
'isPiPActive',
'isFullscreenActive',
]);
const isProviderWritableProp = (prop) => isWritableProp(prop) || providerWritableProps.has(prop);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
const PROVIDER_CACHE_KEY = Symbol('vmProviderCache');
const PROVIDER_CONNECT_EVENT = 'vmMediaProviderConnect';
const PROVIDER_DISCONNECT_EVENT = 'vmMediaProviderDisconnect';
function buildProviderConnectEvent(name, host) {
return new CustomEvent(name, {
bubbles: true,
composed: true,
detail: host,
});
}
function withProviderHost(connector) {
const el = getElement(connector);
const disposal = new Disposal();
const cache = new Map();
connector[PROVIDER_CACHE_KEY] = cache;
function initCache() {
Object.keys(connector).forEach(prop => {
cache.set(prop, connector[prop]);
});
}
function onDisconnect() {
writeTask(() => __awaiter(this, void 0, void 0, function* () {
var _a;
connector.ready = false;
connector.provider = undefined;
cache.clear();
(_a = connector.onProviderDisconnect) === null || _a === void 0 ? void 0 : _a.call(connector);
el.dispatchEvent(buildProviderConnectEvent(PROVIDER_DISCONNECT_EVENT));
}));
}
function onConnect(event) {
event.stopImmediatePropagation();
initCache();
const hostRef = event.detail;
const host = getElement(event.detail);
if (connector.provider === host)
return;
const name = host === null || host === void 0 ? void 0 : host.nodeName.toLowerCase().replace('vm-', '');
writeTask(() => __awaiter(this, void 0, void 0, function* () {
connector.provider = host;
connector.currentProvider = Object.values(Provider).find(provider => name === provider);
createStencilHook(hostRef, undefined, () => onDisconnect());
}));
}
function onChange(event) {
var _a;
event.stopImmediatePropagation();
const { by, prop, value } = event.detail;
if (!isProviderWritableProp(prop)) {
(_a = connector.logger) === null || _a === void 0 ? void 0 : _a.warn(`${by.nodeName} tried to change \`${prop}\` but it is readonly.`);
return;
}
writeTask(() => {
cache.set(prop, value);
connector[prop] = value;
});
}
createStencilHook(connector, () => {
disposal.add(listen(el, PROVIDER_CONNECT_EVENT, onConnect));
disposal.add(listen(el, PROVIDER_CHANGE_EVENT, onChange));
}, () => {
disposal.empty();
cache.clear();
});
}
function withProviderConnect(ref) {
const connectEvent = buildProviderConnectEvent(PROVIDER_CONNECT_EVENT, ref);
createStencilHook(ref, () => {
getElement(ref).dispatchEvent(connectEvent);
});
}
export { PROVIDER_CACHE_KEY as P, withProviderHost as a, createProviderDispatcher as c, withProviderConnect as w };