UNPKG

@ktt45678/vidstack

Version:

UI component library for building high-quality, accessible video and audio experiences on the web.

112 lines (109 loc) 3.54 kB
import { IS_CHROME, IS_IOS, canGoogleCastSrc } from './vidstack-CTW_LGt6.js'; import { loadScript } from './vidstack-CVbXna2m.js'; import { getCastContext, getCastSession, isCastConnected, hasLoadedCastFramework, isCastAvailable, getCastErrorMessage, getDefaultCastOptions, getCastFrameworkURL } from './vidstack-D2Jcqk64.js'; import { peek } from './vidstack-C6myozhB.js'; import './vidstack-BeyDmEgV.js'; import '@floating-ui/dom'; class GoogleCastLoader { constructor() { this.name = "google-cast"; } /** * @see {@link https://developers.google.com/cast/docs/reference/web_sender/cast.framework.CastContext} */ get cast() { return getCastContext(); } mediaType() { return "video"; } canPlay(src) { return IS_CHROME && !IS_IOS && canGoogleCastSrc(src); } async prompt(ctx) { let loadEvent, openEvent, errorEvent; try { loadEvent = await this.Ej(ctx); if (!this.f) { this.f = new cast.framework.RemotePlayer(); new cast.framework.RemotePlayerController(this.f); } openEvent = ctx.player.createEvent("google-cast-prompt-open", { trigger: loadEvent }); ctx.player.dispatchEvent(openEvent); this.Ce(ctx, "connecting", openEvent); await this.Fj(peek(ctx.$props.googleCast)); ctx.$state.remotePlaybackInfo.set({ deviceName: getCastSession()?.getCastDevice().friendlyName }); if (isCastConnected()) this.Ce(ctx, "connected", openEvent); } catch (code) { const error = code instanceof Error ? code : this.De( (code + "").toUpperCase(), "Prompt failed." ); errorEvent = ctx.player.createEvent("google-cast-prompt-error", { detail: error, trigger: openEvent ?? loadEvent, cancelable: true }); ctx.player.dispatch(errorEvent); this.Ce( ctx, isCastConnected() ? "connected" : "disconnected", errorEvent ); throw error; } finally { ctx.player.dispatch("google-cast-prompt-close", { trigger: errorEvent ?? openEvent ?? loadEvent }); } } async load(ctx) { if (!this.f) { throw Error("[vidstack] google cast player was not initialized"); } return new (await import('../providers/vidstack-google-cast.js')).GoogleCastProvider(this.f, ctx); } async Ej(ctx) { if (hasLoadedCastFramework()) return; const loadStartEvent = ctx.player.createEvent("google-cast-load-start"); ctx.player.dispatch(loadStartEvent); await loadScript(getCastFrameworkURL()); await customElements.whenDefined("google-cast-launcher"); const loadedEvent = ctx.player.createEvent("google-cast-loaded", { trigger: loadStartEvent }); ctx.player.dispatch(loadedEvent); if (!isCastAvailable()) { throw this.De("CAST_NOT_AVAILABLE", "Google Cast not available on this platform."); } return loadedEvent; } async Fj(options) { this.Gj(options); const errorCode = await this.cast.requestSession(); if (errorCode) { throw this.De( errorCode.toUpperCase(), getCastErrorMessage(errorCode) ); } } Gj(options) { this.cast?.setOptions({ ...getDefaultCastOptions(), ...options }); } Ce(ctx, state, trigger) { const detail = { type: "google-cast", state }; ctx.delegate.c("remote-playback-change", detail, trigger); } De(code, message) { const error = Error(message); error.code = code; return error; } } export { GoogleCastLoader };