class WebRTCStreamerSelectorElement extends HTMLElement { static get observedAttributes() { return ['selected', 'webrtcurl']; } constructor() { super(); this.shadowDOM = this.attachShadow({mode: 'open'}); this.shadowDOM.innerHTML = `
`; } connectedCallback() { this.fillList(); } attributeChangedCallback(attrName, oldVal, newVal) { if (attrName === "selected") { this.selected = newVal; let mediaList = this.shadowDOM.getElementById("mediaList"); for (const option of mediaList.getElementsByTagName('option')) { if (option === newVal) { option.selected = true; } } } else if (attrName === "webrtcurl") { this.fillList(); } } fillList() { let mediaList = this.shadowDOM.getElementById("mediaList"); const webrtcurl = this.getAttribute("webrtcurl") || ""; fetch(webrtcurl + "/api/getMediaList").then(r => r.json()).then( (response) => { response.forEach( (media) => { var newOption = document.createElement("option"); newOption.text = media.video; newOption.value = JSON.stringify(media); if (this.selected && (this.selected === newOption.text) ) { newOption.selected = true; } mediaList.appendChild(newOption); }); if (mediaList.selectedOptions.length > 0) { this.dispatchEvent(new CustomEvent('change', { detail: { url: mediaList.selectedOptions[0].value, } })); } }); mediaList.onchange = (event) => { this.dispatchEvent(new CustomEvent('change', { detail: { url: mediaList.selectedOptions[0].value, } })); } } } customElements.define('webrtc-streamer-selector', WebRTCStreamerSelectorElement);