commit a7d541a1cf0860ba1df4ac16055412ea771bdff8
Author: Daniel Legt
", f"{RELOAD_SNIPPET}") + body = html.encode("utf-8") + + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + return BytesIO(body) + + return super().send_head() + + def handle_hotreload(self): + self.send_response(200) + self.send_header("Content-Type", "text/event-stream") + self.send_header("Cache-Control", "no-store") + self.send_header("Connection", "keep-alive") + self.end_headers() + + last_seen = latest_mtime() + while True: + time.sleep(0.5) + current = latest_mtime() + if current > last_seen: + last_seen = current + try: + self.wfile.write(b"event: reload\ndata: changed\n\n") + self.wfile.flush() + except (BrokenPipeError, ConnectionResetError): + break + + +def latest_mtime(): + latest = 0.0 + for directory, names, files in os.walk(ROOT): + if ".git" in names: + names.remove(".git") + + for filename in files: + path = Path(directory) / filename + if path.suffix in WATCH_EXTENSIONS: + latest = max(latest, path.stat().st_mtime) + + return latest + + +def main(): + parser = argparse.ArgumentParser(description="Run a tiny p5 dev server with hot reload.") + parser.add_argument("--host", default="0.0.0.0") + parser.add_argument("--port", type=int, default=8000) + args = parser.parse_args() + + server, port = create_server(args.host, args.port) + print(f"Serving http://{args.host}:{port}", flush=True) + print("Watching .html, .css, and .js files for changes", flush=True) + server.serve_forever() + + +def create_server(host, preferred_port): + for port in range(preferred_port, preferred_port + 20): + try: + return ThreadingHTTPServer((host, port), HotReloadHandler), port + except OSError as error: + if error.errno != errno.EADDRINUSE: + raise + + raise OSError(f"No available port found from {preferred_port} to {preferred_port + 19}") + + +if __name__ == "__main__": + main() diff --git a/index.html b/index.html new file mode 100644 index 0000000..562a55a --- /dev/null +++ b/index.html @@ -0,0 +1,40 @@ + + + +
+ + +
+ + + + + +
+ +