diff --git a/scripts/x/elevate-adapter-superpowerd b/scripts/x/elevate-adapter-superpowerd index fefede7..03d5660 100755 --- a/scripts/x/elevate-adapter-superpowerd +++ b/scripts/x/elevate-adapter-superpowerd @@ -191,45 +191,55 @@ def _execute_on_superpowerd(conn, cmd, cwd, token): def handle(conn): with conn: - data = b"" - while chunk := conn.recv(65536): - data += chunk - if b"\n" in data: - break - try: - req = json.loads(data) - except json.JSONDecodeError as e: - send_error(conn, f"elevate-adapter: bad request: {e}") - return + _handle_inner(conn) + except Exception as e: + try: + send_error(conn, f"elevate-adapter: internal error: {e}") + except OSError: + pass - cmd = req.get("cmd", "") - cwd = req.get("cwd", os.getcwd()) - token = os.environ.get("SUPERPOWERD_SESSION_TOKEN", "") +def _handle_inner(conn): + data = b"" + while chunk := conn.recv(65536): + data += chunk + if b"\n" in data: + break - # First attempt - sp_data, done = _execute_on_superpowerd(conn, cmd, cwd, token) - if done: - _finish_response(conn, sp_data) - return + try: + req = json.loads(data) + except json.JSONDecodeError as e: + send_error(conn, f"elevate-adapter: bad request: {e}") + return - # Auth error — refresh token and retry once - with _token_lock: - # Re-read in case another thread already refreshed - current = os.environ.get("SUPERPOWERD_SESSION_TOKEN", "") - if current == token: - new_token = refresh_token() - else: - new_token = current + cmd = req.get("cmd", "") + cwd = req.get("cwd", os.getcwd()) - if not new_token: - # Refresh failed — report the original auth error - _finish_response(conn, sp_data) - return + token = os.environ.get("SUPERPOWERD_SESSION_TOKEN", "") - sp_data, _ = _execute_on_superpowerd(conn, cmd, cwd, new_token) + # First attempt + sp_data, done = _execute_on_superpowerd(conn, cmd, cwd, token) + if done: _finish_response(conn, sp_data) + return + + # Auth error — refresh token and retry once + with _token_lock: + # Re-read in case another thread already refreshed + current = os.environ.get("SUPERPOWERD_SESSION_TOKEN", "") + if current == token: + new_token = refresh_token() + else: + new_token = current + + if not new_token: + # Refresh failed — report the original auth error + _finish_response(conn, sp_data) + return + + sp_data, _ = _execute_on_superpowerd(conn, cmd, cwd, new_token) + _finish_response(conn, sp_data) def _finish_response(conn, sp_data):