Pictures!
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

server.js 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. var fs = require("fs");
  2. var http = require("http");
  3. var crypto = require("crypto");
  4. var pathlib = require("path");
  5. var urllib = require("url");
  6. var conf = JSON.parse(fs.readFileSync("conf.json"));
  7. var index = fs.readFileSync("index.html", "utf-8")
  8. .replace("{{transition_time}}", conf.transition_time);
  9. function error(res, err) {
  10. console.trace(err);
  11. res.end(err.toString());
  12. }
  13. // The individual slide
  14. function Slide(dir) {
  15. var self = {};
  16. self.dir = dir;
  17. function serve(parts, res) {
  18. if (parts.pathname === "/slide") {
  19. fs.createReadStream(pathlib.join(dir, "index.html"))
  20. .on("error", err => error(res, err))
  21. .pipe(res);
  22. } else {
  23. var name = parts.pathname.replace(dir, "");
  24. fs.createReadStream(pathlib.join(dir, name))
  25. .on("error", err => error(res, err))
  26. .pipe(res);
  27. }
  28. }
  29. self.serve = function(parts, res) {
  30. try {
  31. serve(parts, res);
  32. } catch (err) {
  33. if (err.code && err.code === "ENOENT")
  34. res.writeHead(404);
  35. error(res, err);
  36. }
  37. }
  38. return self;
  39. }
  40. // The slideshow, whose job it is to manage all slides
  41. // and tell the client whether it has to update or not
  42. function Slideshow(dir, changeInterval) {
  43. var self = {};
  44. var currentSlide = null;
  45. var awaiters = [];
  46. self.sendEvent = function(evt, args) {
  47. awaiters.forEach(res => res.end(JSON.stringify({
  48. evt: evt,
  49. args: args
  50. })));
  51. }
  52. self.serve = function(req, res) {
  53. var parts = urllib.parse(req.url);
  54. // /: Send the base site to the client
  55. if (parts.pathname === "/") {
  56. res.end(index);
  57. // /init: send initial information about current slide
  58. } else if (parts.pathname === "/init") {
  59. res.end(currentSlide ? currentSlide.dir : "");
  60. // /await: long polling, request won't end before a new slide comes
  61. } else if (parts.pathname === "/await") {
  62. awaiters.push(res);
  63. // There's a current slide: leave serving files up to the slide
  64. } else if (currentSlide) {
  65. currentSlide.serve(parts, res);
  66. // There's no current slide show
  67. } else {
  68. res.end("No current slideshow.");
  69. }
  70. }
  71. // This function starts the slideshow and goes through the slides
  72. // one by one. When done, it starts again by calling this function again.
  73. function init() {
  74. var slides = fs.readdirSync(dir)
  75. .sort()
  76. .map(file => Slide(pathlib.join(dir, file)));
  77. var slideIndex = 0;
  78. currentSlide = slides[slideIndex];
  79. var interval = setInterval(() => {
  80. slideIndex += 1;
  81. // Go to the next slide, or restart
  82. if (slideIndex >= slides.length) {
  83. clearInterval(interval);
  84. init();
  85. } else {
  86. currentSlide = slides[slideIndex];
  87. }
  88. // End all awaiting connections to notify slide change
  89. self.sendEvent("next", { name: currentSlide.dir });
  90. }, changeInterval);
  91. }
  92. init();
  93. return self;
  94. }
  95. var slideshow = Slideshow(conf.slides, conf.interval);
  96. function onexit() {
  97. slideshow.sendEvent("reload");
  98. process.exit();
  99. }
  100. process.on("exit", onexit);
  101. process.on("SIGINT", onexit);
  102. process.on("SIGTERM", onexit);
  103. http.createServer((req, res) => {
  104. slideshow.serve(req, res);
  105. }).listen(conf.port);