alias3-web / serve.py
vmayoral's picture
alias3-web: 4-bit WebGPU graph, readout files, library and demo
2ab2e60 verified
Raw History Blame Contribute Delete
2.66 kB
#!/usr/bin/env python3
"""Static server for the alias-web bundle, with HTTP Range support for the 2.4 GB weight file.
python3 serve.py [port] # default 8924; then open http://127.0.0.1:<port> in Chrome or Edge
Binds to 127.0.0.1 only. Responses are marked no-store so that a changed module is never served stale;
CORS is open so that a local browser extension can fetch the model from this server.
"""
import http.server, os, re, socketserver, sys
ROOT = os.path.dirname(os.path.abspath(__file__))
class Handler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *a, **kw):
super().__init__(*a, directory=ROOT, **kw)
def send_head(self):
self._remaining = None
path = self.translate_path(self.path)
rng = self.headers.get("Range")
if not rng or not os.path.isfile(path):
return super().send_head()
size = os.path.getsize(path)
m = re.match(r"bytes=(\d*)-(\d*)$", rng.strip())
if not m or not (m.group(1) or m.group(2)):
self.send_error(416)
return None
if m.group(1):
start, end = int(m.group(1)), min(int(m.group(2)) if m.group(2) else size - 1, size - 1)
else: # suffix form: the last N bytes
start, end = max(0, size - int(m.group(2))), size - 1
if start > end:
self.send_error(416)
return None
f = open(path, "rb")
f.seek(start)
self._remaining = end - start + 1
self.send_response(206)
self.send_header("Content-Type", self.guess_type(path))
self.send_header("Content-Range", f"bytes {start}-{end}/{size}")
self.send_header("Content-Length", str(self._remaining))
self.end_headers()
return f
def copyfile(self, source, outputfile):
if self._remaining is None:
return super().copyfile(source, outputfile)
left = self._remaining
while left > 0:
chunk = source.read(min(1 << 20, left))
if not chunk:
break
outputfile.write(chunk)
left -= len(chunk)
def end_headers(self):
self.send_header("Accept-Ranges", "bytes")
self.send_header("Cache-Control", "no-store")
self.send_header("Access-Control-Allow-Origin", "*")
super().end_headers()
socketserver.TCPServer.allow_reuse_address = True
if __name__ == "__main__":
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8924
with socketserver.ThreadingTCPServer(("127.0.0.1", port), Handler) as s:
print(f"serving {ROOT} on http://127.0.0.1:{port}")
s.serve_forever()