diff --git a/edit/server.py b/edit/server.py index cd47753..721ee68 100644 --- a/edit/server.py +++ b/edit/server.py @@ -2,11 +2,11 @@ from __future__ import annotations +import asyncio import os import re import secrets import sqlite3 -import subprocess import time from contextlib import contextmanager from pathlib import Path @@ -248,21 +248,25 @@ async def delete_story(slug: str, user: dict = Depends(require_auth)) -> JSONRes @app.post("/rebuild") async def rebuild(user: dict = Depends(require_auth)) -> JSONResponse: - """Trigger an astro build of the site.""" + """Trigger an astro build of the site (non-blocking).""" try: - result = subprocess.run( - ["npm", "run", "build"], + proc = await asyncio.create_subprocess_exec( + "npm", "run", "build", cwd=site_dir, - capture_output=True, - text=True, - timeout=120, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, ) + try: + stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=120) + except asyncio.TimeoutError: + proc.kill() + raise HTTPException(504, "Build timed out after 120s") return JSONResponse({ - "success": result.returncode == 0, - "stdout": result.stdout[-3000:] if result.stdout else "", - "stderr": result.stderr[-3000:] if result.stderr else "", + "success": proc.returncode == 0, + "stdout": stdout.decode()[-3000:] if stdout else "", + "stderr": stderr.decode()[-3000:] if stderr else "", }) - except subprocess.TimeoutExpired: - raise HTTPException(504, "Build timed out after 120s") + except HTTPException: + raise except Exception as e: raise HTTPException(500, str(e)) diff --git a/site b/site index 422ffe7..c3573b0 160000 --- a/site +++ b/site @@ -1 +1 @@ -Subproject commit 422ffe76fa81c1db82cbc47fb1a4c574b67c21d9 +Subproject commit c3573b09a34dbc11ae6e1225c66e816cd3cbde23