mirror of
https://github.com/Textualize/textual-web.git
synced 2025-10-17 02:36:40 +03:00
web interface
This commit is contained in:
@@ -92,6 +92,7 @@ def print_disclaimer() -> None:
|
||||
default=0,
|
||||
help="Exit textual-web when no apps have been launched in WAIT seconds",
|
||||
)
|
||||
@click.option("-w", "--web-interface", is_flag=True, help="Enable web interface")
|
||||
@click.option("-s", "--signup", is_flag=True, help="Create a textual-web account.")
|
||||
@click.option("--welcome", is_flag=True, help="Launch an example app.")
|
||||
@click.option("--merlin", is_flag=True, help="Launch Merlin game.")
|
||||
@@ -102,6 +103,7 @@ def app(
|
||||
dev: bool,
|
||||
terminal: bool,
|
||||
exit_on_idle: int,
|
||||
web_interface: bool,
|
||||
api_key: str,
|
||||
signup: bool,
|
||||
welcome: bool,
|
||||
@@ -185,6 +187,7 @@ def app(
|
||||
api_key=api_key or None,
|
||||
devtools=dev,
|
||||
exit_on_idle=exit_on_idle,
|
||||
web_interface=web_interface,
|
||||
)
|
||||
|
||||
for app_command in run:
|
||||
|
||||
@@ -5,7 +5,7 @@ import logging
|
||||
from time import monotonic
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
EXIT_POLL_RATE = 15
|
||||
EXIT_POLL_RATE = 5
|
||||
|
||||
log = logging.getLogger("textual-web")
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@ from .retry import Retry
|
||||
from .session import SessionConnector
|
||||
from .session_manager import SessionManager
|
||||
from .types import Meta, RouteKey, SessionID
|
||||
from .web import run_web_interface
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .config import Config
|
||||
@@ -78,10 +80,12 @@ class GanglionClient(Handlers):
|
||||
api_key: str | None,
|
||||
devtools: bool = False,
|
||||
exit_on_idle: int = 0,
|
||||
web_interface: bool = False,
|
||||
) -> None:
|
||||
self.environment = environment
|
||||
self.websocket_url = environment.url
|
||||
self.exit_on_idle = exit_on_idle
|
||||
self.web_interface = web_interface
|
||||
|
||||
abs_path = Path(config_path).absolute()
|
||||
path = abs_path if abs_path.is_dir() else abs_path.parent
|
||||
@@ -165,6 +169,7 @@ class GanglionClient(Handlers):
|
||||
|
||||
async def run(self) -> None:
|
||||
"""Run the connection loop."""
|
||||
|
||||
try:
|
||||
self._exit_poller.start()
|
||||
await self._run()
|
||||
@@ -201,7 +206,15 @@ class GanglionClient(Handlers):
|
||||
self._poller.set_loop(loop)
|
||||
self._poller.start()
|
||||
|
||||
self._task = asyncio.create_task(self.connect())
|
||||
if self.web_interface:
|
||||
app = await run_web_interface()
|
||||
try:
|
||||
self._task = asyncio.create_task(self.connect())
|
||||
finally:
|
||||
await app.shutdown()
|
||||
else:
|
||||
self._task = asyncio.create_task(self.connect())
|
||||
|
||||
await self._task
|
||||
|
||||
def force_exit(self) -> None:
|
||||
|
||||
30
src/textual_web/web.py
Normal file
30
src/textual_web/web.py
Normal file
@@ -0,0 +1,30 @@
|
||||
"""
|
||||
An optional web interface to control textual-web
|
||||
|
||||
Note: Currently just a stub.
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from aiohttp import web
|
||||
|
||||
|
||||
log = logging.getLogger("textual-web")
|
||||
|
||||
|
||||
async def run_web_interface() -> web.Application:
|
||||
"""Run the web interface."""
|
||||
|
||||
async def health_check(request) -> web.Response:
|
||||
return web.Response(text="Hello, world")
|
||||
|
||||
app = web.Application()
|
||||
app.add_routes([web.get("/health-check/", health_check)])
|
||||
|
||||
runner = web.AppRunner(app)
|
||||
await runner.setup()
|
||||
site = web.TCPSite(runner, "0.0.0.0", 8080)
|
||||
await site.start()
|
||||
log.info("Web interface started on port 8080")
|
||||
return app
|
||||
Reference in New Issue
Block a user