const Peer = require('../../server/src/peer') const VideoConverter = require('./lib/dist/video-converter'); let current_data = {}; let peer; let player; /** * Validates that the user is logged in by sending the token */ checkIfLoggedIn = async () => { // const token = window.localStorage.getItem('token') // console.log(token) // if(!token){ // console.log("You need to login") // renderLogin() // }else{ // //Check if the token is valid // const response = await fetch('http://localhost:8080/auth/validation', { // method: 'POST', // headers: {'Authorization': token} // }) // console.log('RESPONSE', response) // //Token is valid, show available streams // if(response.status === 200){ // console.log("SUCCESS") renderThumbnails() // } // } } /** * Returns a list of available streams */ getAvailableStreams = async () => { try{ const streamsInJson = await fetch(`./streams`); const streams = await streamsInJson.json(); console.log('AVAILABLE', streams) return streams; }catch(err){ console.log(err) } } createVideoPlayer = () => { const containerDiv = document.getElementById('container') containerDiv.innerHTML = `<h1>Stream from source ${current_data.uri}</h1><br> <button onclick="renderThumbnails(); closeStream()">Go back</button> <button onclick="connectToStream()">Start Stream</button><br> <button onclick="webSocketTest()">WebSocket Test</button><br> <video id="ftlab-stream-video" width="640" height="360"></video>`; containerDiv.innerHTML += '<br>' containerDiv.innerHTML += '' createPeer(); connectToStream(); } /** * Creates thumbnail (image) for all available streams and adds them to div class='container' */ renderThumbnails = async () => { const thumbnails = await getAvailableStreams(); const containerDiv = document.getElementById('container') containerDiv.innerHTML = ''; containerDiv.innerHTML = `<button onClick="configs()">change configs</button>` containerDiv.innerHTML += `<div class="ftlab-stream-thumbnails"></div>` if(thumbnails.length === 0){ containerDiv.innerHTML = `<h3>No streams running currently</h3>` }else{ for(var i=0; i<thumbnails.length; i++){ const encodedURI = encodeURIComponent(thumbnails[i]) current_data.uri = thumbnails[i] console.log("URI to be added", thumbnails[i]) try{ const someData = await fetch(`./stream/rgb?uri=${encodedURI}`) console.log('SOME DATA', someData) if(!someData.ok){ throw new Error('Image not found') } const myBlob = await someData.blob(); console.log('BLOB', myBlob) const objectURL = URL.createObjectURL(myBlob); // containerDiv.innerHTML += createCard() containerDiv.innerHTML += createCard(objectURL, i+4) }catch(err){ console.log("Couldn't create thumbnail"); console.log(err) } } } } /** * Method to create a single thumbnail */ createCard = (url, viewers) => { return `<div class='ftlab-card-component' > <img src='${url}' class="thumbnail-img" alt="Hups" width="250px"></img> <p>Viewers: ${viewers}</p> <button onclick="createVideoPlayer()">button</button> </div>` } createPeer = () => { const ws = new WebSocket("ws://" + location.host + ":" + (location.port == "" ? "80" : location.port) + location.pathname); ws.binaryType = "arraybuffer"; peer = new Peer(ws) } webSocketTest = () => { peer.send("update_cfg", "ftl://utu.fi#reconstruction_default/0/renderer/cool_effect", "true") } connectToStream = () => { const element = document.getElementById('ftlab-stream-video'); const converter = new VideoConverter.default(element, 20, 6); peer.bind(current_data.uri, (latency, streampckg, pckg) => { if(pckg[0] === 2){ function decode(value){ converter.appendRawData(value); } decode(pckg[5]); converter.play(); }; }) // Start the transaction peer.send("get_stream", (current_data.uri, 30, 0, current_data.uri)); } closeStream = () => { peer.sock.close() } /** * ************** * CONFIGURATIONS * ************** */ current_data.configURI = "ftl://utu.fi#reconstruction_snap8/net" configs = () => { const container = document.getElementById("container"); container.innerHTML = `<div class="ftlab-configurations"></div>`; renderConfigOptions(); } renderConfigOptions = () => { const input = `<p>input1</p><br>ftl://utu.fi#<input type="text">` const doc = document.getElementsByClassName('ftlab-configurations')[0]; doc.innerHTML = input; } /** * */ loadConfigs = async (str) => { const configURI = encodeURIComponent(`ftl://utu.fi#reconstruction_snap8${str}`); const uri = encodeURIComponent(current_data.uri) const rawResp = await fetch(`./stream/config?settings=${configURI}&uri=${uri}`) const response = await rawResp.json(); const content = JSON.parse(response); container.innerHTML += `<p>${response}</p>`; } // current_data.configData = '{"peers": 1}'; /** * Method to send configurations to backend */ saveConfigs = async () => { let {uri, configURI, configData} = current_data const rawResp = await fetch('./stream/config', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({peerURI: uri, configURI, data: configData, saveToCPP: true}) }); const content = await rawResp.json(); }