Delete api_server
Browse files- api_server/__init__.py +0 -0
- api_server/routes/__init__.py +0 -0
- api_server/routes/internal/README.md +0 -3
- api_server/routes/internal/__init__.py +0 -0
- api_server/routes/internal/internal_routes.py +0 -73
- api_server/services/__init__.py +0 -0
- api_server/services/terminal_service.py +0 -60
- api_server/utils/file_operations.py +0 -42
api_server/__init__.py
DELETED
|
File without changes
|
api_server/routes/__init__.py
DELETED
|
File without changes
|
api_server/routes/internal/README.md
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
# ComfyUI Internal Routes
|
| 2 |
-
|
| 3 |
-
All routes under the `/internal` path are designated for **internal use by ComfyUI only**. These routes are not intended for use by external applications may change at any time without notice.
|
|
|
|
|
|
|
|
|
|
|
|
api_server/routes/internal/__init__.py
DELETED
|
File without changes
|
api_server/routes/internal/internal_routes.py
DELETED
|
@@ -1,73 +0,0 @@
|
|
| 1 |
-
from aiohttp import web
|
| 2 |
-
from typing import Optional
|
| 3 |
-
from folder_paths import folder_names_and_paths, get_directory_by_type
|
| 4 |
-
from api_server.services.terminal_service import TerminalService
|
| 5 |
-
import app.logger
|
| 6 |
-
import os
|
| 7 |
-
|
| 8 |
-
class InternalRoutes:
|
| 9 |
-
'''
|
| 10 |
-
The top level web router for internal routes: /internal/*
|
| 11 |
-
The endpoints here should NOT be depended upon. It is for ComfyUI frontend use only.
|
| 12 |
-
Check README.md for more information.
|
| 13 |
-
'''
|
| 14 |
-
|
| 15 |
-
def __init__(self, prompt_server):
|
| 16 |
-
self.routes: web.RouteTableDef = web.RouteTableDef()
|
| 17 |
-
self._app: Optional[web.Application] = None
|
| 18 |
-
self.prompt_server = prompt_server
|
| 19 |
-
self.terminal_service = TerminalService(prompt_server)
|
| 20 |
-
|
| 21 |
-
def setup_routes(self):
|
| 22 |
-
@self.routes.get('/logs')
|
| 23 |
-
async def get_logs(request):
|
| 24 |
-
return web.json_response("".join([(l["t"] + " - " + l["m"]) for l in app.logger.get_logs()]))
|
| 25 |
-
|
| 26 |
-
@self.routes.get('/logs/raw')
|
| 27 |
-
async def get_raw_logs(request):
|
| 28 |
-
self.terminal_service.update_size()
|
| 29 |
-
return web.json_response({
|
| 30 |
-
"entries": list(app.logger.get_logs()),
|
| 31 |
-
"size": {"cols": self.terminal_service.cols, "rows": self.terminal_service.rows}
|
| 32 |
-
})
|
| 33 |
-
|
| 34 |
-
@self.routes.patch('/logs/subscribe')
|
| 35 |
-
async def subscribe_logs(request):
|
| 36 |
-
json_data = await request.json()
|
| 37 |
-
client_id = json_data["clientId"]
|
| 38 |
-
enabled = json_data["enabled"]
|
| 39 |
-
if enabled:
|
| 40 |
-
self.terminal_service.subscribe(client_id)
|
| 41 |
-
else:
|
| 42 |
-
self.terminal_service.unsubscribe(client_id)
|
| 43 |
-
|
| 44 |
-
return web.Response(status=200)
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
@self.routes.get('/folder_paths')
|
| 48 |
-
async def get_folder_paths(request):
|
| 49 |
-
response = {}
|
| 50 |
-
for key in folder_names_and_paths:
|
| 51 |
-
response[key] = folder_names_and_paths[key][0]
|
| 52 |
-
return web.json_response(response)
|
| 53 |
-
|
| 54 |
-
@self.routes.get('/files/{directory_type}')
|
| 55 |
-
async def get_files(request: web.Request) -> web.Response:
|
| 56 |
-
directory_type = request.match_info['directory_type']
|
| 57 |
-
if directory_type not in ("output", "input", "temp"):
|
| 58 |
-
return web.json_response({"error": "Invalid directory type"}, status=400)
|
| 59 |
-
|
| 60 |
-
directory = get_directory_by_type(directory_type)
|
| 61 |
-
sorted_files = sorted(
|
| 62 |
-
(entry for entry in os.scandir(directory) if entry.is_file()),
|
| 63 |
-
key=lambda entry: -entry.stat().st_mtime
|
| 64 |
-
)
|
| 65 |
-
return web.json_response([entry.name for entry in sorted_files], status=200)
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
def get_app(self):
|
| 69 |
-
if self._app is None:
|
| 70 |
-
self._app = web.Application()
|
| 71 |
-
self.setup_routes()
|
| 72 |
-
self._app.add_routes(self.routes)
|
| 73 |
-
return self._app
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
api_server/services/__init__.py
DELETED
|
File without changes
|
api_server/services/terminal_service.py
DELETED
|
@@ -1,60 +0,0 @@
|
|
| 1 |
-
from app.logger import on_flush
|
| 2 |
-
import os
|
| 3 |
-
import shutil
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
class TerminalService:
|
| 7 |
-
def __init__(self, server):
|
| 8 |
-
self.server = server
|
| 9 |
-
self.cols = None
|
| 10 |
-
self.rows = None
|
| 11 |
-
self.subscriptions = set()
|
| 12 |
-
on_flush(self.send_messages)
|
| 13 |
-
|
| 14 |
-
def get_terminal_size(self):
|
| 15 |
-
try:
|
| 16 |
-
size = os.get_terminal_size()
|
| 17 |
-
return (size.columns, size.lines)
|
| 18 |
-
except OSError:
|
| 19 |
-
try:
|
| 20 |
-
size = shutil.get_terminal_size()
|
| 21 |
-
return (size.columns, size.lines)
|
| 22 |
-
except OSError:
|
| 23 |
-
return (80, 24) # fallback to 80x24
|
| 24 |
-
|
| 25 |
-
def update_size(self):
|
| 26 |
-
columns, lines = self.get_terminal_size()
|
| 27 |
-
changed = False
|
| 28 |
-
|
| 29 |
-
if columns != self.cols:
|
| 30 |
-
self.cols = columns
|
| 31 |
-
changed = True
|
| 32 |
-
|
| 33 |
-
if lines != self.rows:
|
| 34 |
-
self.rows = lines
|
| 35 |
-
changed = True
|
| 36 |
-
|
| 37 |
-
if changed:
|
| 38 |
-
return {"cols": self.cols, "rows": self.rows}
|
| 39 |
-
|
| 40 |
-
return None
|
| 41 |
-
|
| 42 |
-
def subscribe(self, client_id):
|
| 43 |
-
self.subscriptions.add(client_id)
|
| 44 |
-
|
| 45 |
-
def unsubscribe(self, client_id):
|
| 46 |
-
self.subscriptions.discard(client_id)
|
| 47 |
-
|
| 48 |
-
def send_messages(self, entries):
|
| 49 |
-
if not len(entries) or not len(self.subscriptions):
|
| 50 |
-
return
|
| 51 |
-
|
| 52 |
-
new_size = self.update_size()
|
| 53 |
-
|
| 54 |
-
for client_id in self.subscriptions.copy(): # prevent: Set changed size during iteration
|
| 55 |
-
if client_id not in self.server.sockets:
|
| 56 |
-
# Automatically unsub if the socket has disconnected
|
| 57 |
-
self.unsubscribe(client_id)
|
| 58 |
-
continue
|
| 59 |
-
|
| 60 |
-
self.server.send_sync("logs", {"entries": entries, "size": new_size}, client_id)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
api_server/utils/file_operations.py
DELETED
|
@@ -1,42 +0,0 @@
|
|
| 1 |
-
import os
|
| 2 |
-
from typing import List, Union, TypedDict, Literal
|
| 3 |
-
from typing_extensions import TypeGuard
|
| 4 |
-
class FileInfo(TypedDict):
|
| 5 |
-
name: str
|
| 6 |
-
path: str
|
| 7 |
-
type: Literal["file"]
|
| 8 |
-
size: int
|
| 9 |
-
|
| 10 |
-
class DirectoryInfo(TypedDict):
|
| 11 |
-
name: str
|
| 12 |
-
path: str
|
| 13 |
-
type: Literal["directory"]
|
| 14 |
-
|
| 15 |
-
FileSystemItem = Union[FileInfo, DirectoryInfo]
|
| 16 |
-
|
| 17 |
-
def is_file_info(item: FileSystemItem) -> TypeGuard[FileInfo]:
|
| 18 |
-
return item["type"] == "file"
|
| 19 |
-
|
| 20 |
-
class FileSystemOperations:
|
| 21 |
-
@staticmethod
|
| 22 |
-
def walk_directory(directory: str) -> List[FileSystemItem]:
|
| 23 |
-
file_list: List[FileSystemItem] = []
|
| 24 |
-
for root, dirs, files in os.walk(directory):
|
| 25 |
-
for name in files:
|
| 26 |
-
file_path = os.path.join(root, name)
|
| 27 |
-
relative_path = os.path.relpath(file_path, directory)
|
| 28 |
-
file_list.append({
|
| 29 |
-
"name": name,
|
| 30 |
-
"path": relative_path,
|
| 31 |
-
"type": "file",
|
| 32 |
-
"size": os.path.getsize(file_path)
|
| 33 |
-
})
|
| 34 |
-
for name in dirs:
|
| 35 |
-
dir_path = os.path.join(root, name)
|
| 36 |
-
relative_path = os.path.relpath(dir_path, directory)
|
| 37 |
-
file_list.append({
|
| 38 |
-
"name": name,
|
| 39 |
-
"path": relative_path,
|
| 40 |
-
"type": "directory"
|
| 41 |
-
})
|
| 42 |
-
return file_list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|