소스 검색

client automatically reloads when the server restarts, and fixed issues with caching

master
mort 8 년 전
부모
커밋
869be60dc7
2개의 변경된 파일54개의 추가작업 그리고 6개의 파일을 삭제
  1. 32
    4
      index.html
  2. 22
    2
      server.js

+ 32
- 4
index.html 파일 보기

} }


// Change slides with a transition // Change slides with a transition
function update() {
function update(name) {
overlay().innerHTML = ""; overlay().innerHTML = "";
overlay().className = "_content"; overlay().className = "_content";
swap(main(), overlay()); swap(main(), overlay());
.then(response => response.text()) .then(response => response.text())
.then(text => { .then(text => {
setTimeout(() => { setTimeout(() => {
history.replaceState({}, "", "/"+name+"/");
main().innerHTML = text; main().innerHTML = text;
overlay().className = "_content hidden"; overlay().className = "_content hidden";
}, 1000); }, 1000);
}) })
.catch(err => console.error(err)); .catch(err => console.error(err));
}

function reload() {
var i = setInterval(() => {
fetch("/")
.then(() => {
history.replaceState({}, "", "/");
location.reload();
})
.catch(() => {});
}, 1000);
}


function await() {
// Wait for the next slide change, then update again // Wait for the next slide change, then update again
fetch("/await") fetch("/await")
.then(response => update())
.catch(err => { console.error(err); update(); });
.then(response => response.json())
.then(obj => {
if (obj.evt === "next") {
update(obj.args.name);
} else if (obj.evt === "reload") {
return reload();
} else {
console.log("Unknown event: "+obj.evt);
}
await();
})
.catch(err => { console.error(err); await(); });
} }


update();
await();

fetch("/init")
.then(response => response.text())
.then(name => update(name));
</script> </script>
</body> </body>
</html> </html>

+ 22
- 2
server.js 파일 보기

.on("error", err => error(res, err)) .on("error", err => error(res, err))
.pipe(res); .pipe(res);
} else { } else {
fs.createReadStream(pathlib.join(dir, parts.pathname))
var name = parts.pathname.replace(dir, "");
fs.createReadStream(pathlib.join(dir, name))
.on("error", err => error(res, err)) .on("error", err => error(res, err))
.pipe(res); .pipe(res);
} }
var currentSlide = null; var currentSlide = null;
var awaiters = []; var awaiters = [];


self.sendEvent = function(evt, args) {
awaiters.forEach(res => res.end(JSON.stringify({
evt: evt,
args: args
})));
}

self.serve = function(req, res) { self.serve = function(req, res) {
var parts = urllib.parse(req.url); var parts = urllib.parse(req.url);


if (parts.pathname === "/") { if (parts.pathname === "/") {
res.end(index); res.end(index);


// /init: send initial information about current slide
} else if (parts.pathname === "/init") {
res.end(currentSlide ? currentSlide.dir : "");

// /await: long polling, request won't end before a new slide comes // /await: long polling, request won't end before a new slide comes
} else if (parts.pathname === "/await") { } else if (parts.pathname === "/await") {
awaiters.push(res); awaiters.push(res);
} }


// End all awaiting connections to notify slide change // End all awaiting connections to notify slide change
awaiters.forEach(res => res.end());
self.sendEvent("next", { name: currentSlide.dir });
}, changeInterval); }, changeInterval);
} }
init(); init();


var slideshow = Slideshow(conf.slides, conf.interval); var slideshow = Slideshow(conf.slides, conf.interval);


function onexit() {
slideshow.sendEvent("reload");
process.exit();
}
process.on("exit", onexit);
process.on("SIGINT", onexit);
process.on("SIGTERM", onexit);

http.createServer((req, res) => { http.createServer((req, res) => {
slideshow.serve(req, res); slideshow.serve(req, res);
}).listen(conf.port); }).listen(conf.port);

Loading…
취소
저장