o
    ?i                     @   s   d dl Z d dlmZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ e Zeje
d	gd
d	gd	gd ejdeddd Zeddd Zeddd ZeddedefddZedkrd dlZd dlZd dlmZ eej ejedejd dS dS )    N)datetime)FastAPI	WebSocket)JSONResponse)WebSocketDisconnect)CORSMiddleware)Config)Log*T)Zallow_originsZallow_credentialsZallow_methodsZallow_headers/)Zresponse_classc                      s
   ddiS )Nmessagez%Mcube Call Service Server is running! r   r   r   homebook/main.py
index_page   s   r   z/healthc                      s   dt   dddS )zBasic health check endpoint.healthyMcube Call Servicez1.0.0)status	timestampserviceversion)r   now	isoformatr   r   r   r   health_check   s   
r   z/health/performancec               
      s   ddl } z:| jdd}|  }| d}|dk r |jdk r dndt  ||jt|j	d	 d
|jt|j
d	 d
dddW S  ty] } zdt  t|dW  Y d}~S d}~ww )z"Performance health check endpoint.r   N   )intervalr   P   r   Zwarningi   @   )cpu_percentZmemory_percentZmemory_available_gbZdisk_percentZdisk_free_gbr   )r   r   systemr   error)r   r   r   )psutilr   Zvirtual_memory
disk_usagepercentr   r   r   roundZ	availablefree	Exceptionstr)r    r   ZmemoryZdisker   r   r   performance_health_check"   s.   


r(   z/ws/{session_id}	websocket
session_idc                    s  t d|  |  I dH  ddlm} ||| I dH s5t d|  | jdddI dH  dS z:j}j	 d	t
d
dffdd}d	t
d
dffdd}dtd
df fdd}t||||}zz|g}tj|tjdI dH \}	}
|
D ]}|  z|I dH  W q} tjy   Y q}w |	D ]^}| r| }t|trt d|  ||I dH   W W ||jv r||I dH  W dS W dS t d| d|  ||I dH   W W ||jv r||I dH  W dS W dS qt d|  ||I dH  W nD ty!   t d|  ||I dH  Y n+ tyK } zt d|  ddl}|  ||I dH  W Y d}~nd}~ww W ||jv r^||I dH  W dS W dS ||jv rp||I dH  w w  ty } zGt d| d|  ddl}|  z
||I dH  W n ty } zt d|  W Y d}~nd}~ww W Y d}~dS W Y d}~dS d}~ww )z=Handle Mcube WebSocket call connection with proper isolation.z#Mcube call connected - Session ID: Nr   )call_manageru&   ❌ Failed to create call session for i  zFailed to create call session)codereasondatareturnc                         | I dH  dS )z&Handle incoming media data from Mcube.N)handle_media_eventr.   sessionr   r   r1   O      z-handle_mcube_call.<locals>.handle_media_eventc                    r0   )z1Handle call start event with full WebSocket data.N)handle_call_startr2   r3   r   r   r6   S   r5   z,handle_mcube_call.<locals>.handle_call_startnamec                    s      |   | I dH  dS )z%Handle playedStream event from Mcube.N)Zhandle_played_stream_event)r7   audio_servicer4   r   r   handle_played_streamW   s   
z/handle_mcube_call.<locals>.handle_played_stream)Zreturn_whenu9   🔌 WebSocket disconnected detected in task for session zTask exception for session z: z)All tasks completed normally for session z#WebSocket disconnected for session zError in media stream handler: u6   ❌ Unexpected error in WebSocket handler for session u   ❌ Error during cleanup: )r	   headerZacceptZservices.call_managerr+   Zcreate_call_sessionr   closeconnection_managerr9   dictr&   asyncioZcreate_taskZreceive_from_mcubewaitZFIRST_COMPLETEDZcancelZCancelledError	exception
isinstancer   infoZremove_call_sessionZactive_sessionsr%   	traceback	print_exc)r)   r*   r+   r=   r1   r6   r:   Z
mcube_taskZtasks_to_waitZdoneZpendingZtaskrA   r'   rD   Zcleanup_errorr   r8   r   handle_mcube_call?   s   



rF   __main__z0.0.0.0)ZhostZport)r?   r   Zfastapir   r   Zfastapi.responsesr   Zfastapi.websocketsr   Zfastapi.middleware.corsr   Zconfigr   Zservices.log_utilsr	   ZappZadd_middlewaregetr   r   r(   r)   r&   rF   __name__ZuvicornatexitregisterZclose_log_filerunZPORTr   r   r   r   <module>   s>    

	
Q