/** * Continual querying of a set route, executing Reveal.js events in callback through Axios */ function poll() { var now = new Date(); axios .get(location.origin + presentationAPIRoute, { params: { action: "poll", mode: "get" } }) .then(function(response) { if (response.data.hasOwnProperty("command")) { console.info( "Ping at " + ISODateString(now) + ", " + response.status + " OK" ); var data = response.data; try { switch (data.command) { case "slidechanged": Reveal.slide(data.indexh, data.indexv); break; case "fragmentshown": Reveal.slide(data.indexh, data.indexv, data.indexf); break; case "fragmenthidden": Reveal.slide(data.indexh, response.data.indexv, data.indexf); break; } } catch (error) { console.error(error); } } else { console.info("Ping at " + ISODateString(now) + ": " + response.status); } }) .catch(function(error) { console.error(error); pollingErrors++; showError("Connection failure."); }); if (pollingErrors >= presentationAPIRetryLimit) { console.warn("Retry limit reached at " + ISODateString(now)); return; } else { setTimeout(poll, presentationAPITimeout); } } /** * Handle data-input from master, using Axios */ var revealMasterEventHandler = function(event) { var request = { command: event.type, indexh: event.indexh, indexv: event.indexv, indexf: event.indexf ? event.indexf : 0 }; if (presentationAPIAuth == "true") { if (findGetParameter("token") !== presentationAuthToken) { return; } } axios.defaults.params = { action: "poll", mode: "set", data: encodeURIComponent(JSON.stringify(request)) }; if (presentationAuthToken) { axios.defaults.params["token"] = presentationAuthToken; } axios .get(location.origin + presentationAPIRoute) .then(function(response) { var now = new Date(); console.info( "Action at " + ISODateString(now) + ", " + response.data.command ); }) .catch(function(error) { console.error(error); showError("Connection failure."); }); }; /** * Handle changes in slave */ var revealSlaveEventHandler = function(event) { var now = new Date(); console.info("Action at " + ISODateString(now) + ", " + event.type); }; /* If Admin, handle input, otherwise poll server */ var pollingErrors = 0; window.addEventListener( "load", function(event) { if (findGetParameter("admin") == "true") { Reveal.addEventListener("slidechanged", revealMasterEventHandler); Reveal.addEventListener("fragmentshown", revealMasterEventHandler); Reveal.addEventListener("fragmenthidden", revealMasterEventHandler); } else { Reveal.addEventListener("slidechanged", revealSlaveEventHandler); Reveal.addEventListener("fragmentshown", revealSlaveEventHandler); Reveal.addEventListener("fragmenthidden", revealSlaveEventHandler); poll(); } }, false );