45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
from typing import Optional
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException, WebSocket
|
|
from vocode.streaming.telephony.config_manager.base_config_manager import (
|
|
BaseConfigManager,
|
|
)
|
|
|
|
from vocode.streaming.telephony.conversation.call import Call
|
|
from vocode.streaming.telephony.templates import Templater
|
|
|
|
|
|
class CallsRouter:
|
|
def __init__(
|
|
self,
|
|
base_url: str,
|
|
templater: Templater,
|
|
config_manager: BaseConfigManager,
|
|
logger: Optional[logging.Logger] = None,
|
|
):
|
|
super().__init__()
|
|
self.base_url = base_url
|
|
self.templater = templater
|
|
self.config_manager = config_manager
|
|
self.logger = logger or logging.getLogger(__name__)
|
|
self.router = APIRouter()
|
|
self.router.websocket("/connect_call/{id}")(self.connect_call)
|
|
|
|
async def connect_call(self, websocket: WebSocket, id: str):
|
|
await websocket.accept()
|
|
self.logger.debug("Phone WS connection opened for chat {}".format(id))
|
|
call_config = self.config_manager.get_config(id)
|
|
if not call_config:
|
|
raise HTTPException(status_code=400, detail="No active phone call")
|
|
|
|
call: Call = Call.from_call_config(
|
|
self.base_url, call_config, self.config_manager, id, self.logger
|
|
)
|
|
|
|
await call.attach_ws_and_start(websocket)
|
|
self.config_manager.delete_config(call.id)
|
|
self.logger.debug("Phone WS connection closed for chat {}".format(id))
|
|
|
|
def get_router(self) -> APIRouter:
|
|
return self.router
|