File size: 2,479 Bytes
24352e2
 
 
 
 
8362005
 
24352e2
8362005
 
 
 
 
24352e2
8362005
 
24352e2
 
8362005
24352e2
 
8362005
 
24352e2
8362005
 
24352e2
 
 
8362005
24352e2
8362005
 
24352e2
8362005
 
 
 
 
 
 
 
24352e2
8362005
 
 
 
 
24352e2
8362005
24352e2
 
8362005
05340a0
 
 
 
 
 
 
 
 
 
8362005
 
05340a0
 
 
35a55c1
05340a0
24352e2
 
 
 
 
 
8362005
 
 
24352e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#
# Copyright (c) 2025, Daily
#
# SPDX-License-Identifier: BSD 2-Clause License
#
import asyncio
import os
import sys
from contextlib import asynccontextmanager
from typing import Any, Dict

import uvicorn
from dotenv import load_dotenv
from fastapi import FastAPI, Request, WebSocket
from fastapi.middleware.cors import CORSMiddleware

# from bot.bot_fast_api import run_bot
from bot.bot_websocket_server import run_bot_websocket_server


# Load environment variables
load_dotenv(override=True)


@asynccontextmanager
async def lifespan(app: FastAPI):
    """Handles FastAPI startup and shutdown."""
    yield  # Run app


# Initialize FastAPI app with lifespan manager
app = FastAPI(lifespan=lifespan)

# Configure CORS to allow requests from any origin
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    print("WebSocket connection accepted")
    try:
        await run_bot_websocket_server(websocket)
    except Exception as e:
        print(f"Exception in run_bot: {e}")


@app.get("/")
async def read_root():
    """Root endpoint that provides basic information about the API."""
    return {
        "message": "VoiceStack API is running",
        "status": "online",
        "endpoints": {"websocket": "/ws", "connect": "/connect"},
    }


@app.post("/connect")
async def bot_connect(request: Request) -> Dict[Any, Any]:
    # return {"ws_url": "ws://localhost:7860/ws"}
    # Get the host from the request headers for dynamic URL generation
    host = request.headers.get("host", "localhost:7860")
    protocol = "wss" if request.url.scheme == "https" else "wss"
    return {"ws_url": f"{protocol}://{host}/ws"}


async def main():
    config = uvicorn.Config(app, host="0.0.0.0", port=7860)
    server = uvicorn.Server(config)
    await server.serve()


if __name__ == "__main__":
    import signal

    async def serve():
        config = uvicorn.Config(app, host="0.0.0.0", port=7860)
        server = uvicorn.Server(config)
        await server.serve()

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    try:
        loop.run_until_complete(serve())
    except KeyboardInterrupt:
        print("Received exit signal (Ctrl+C), shutting down...")
    finally:
        loop.run_until_complete(loop.shutdown_asyncgens())
        loop.close()