
    i                         d Z ddlZddlZddlZddlZddlZddlZddlmZ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mZ dd	lmZ d
 ZdedefdZ G d d      Zy)z1WebSocket connection manager used by FastAPI app.    N)AnyDictOptional)	WebSocket)MessageHandler)AttachmentService)SessionExecutionController)WorkflowSessionStoreSessionStatus)WorkflowRunServicec                     t        | dd       }t        |      r	  |       S t        | d      r	 t	        |       S t        |       S # t        $ r Y .w xY w# t        $ r Y t        |       S w xY w)Nto_dict__dict__)getattrcallable	Exceptionhasattrvarsstr)valuer   s     N/Users/bowang/.openclaw/workspace/ChatDev/server/services/websocket_manager.py_json_defaultr      s}    eY-G	9 uj!	; u:  		
  	u:	s"   A 
A 	AA	A)(A)messagereturnc                 \    t        | t              r| S t        j                  | t              S )N)default)
isinstancer   jsondumpsr   )r   s    r   _encode_ws_messager    #   s"    '3::g}55    c            
           e Zd Zddddddedz  dedz  dedz  dedz  fdZdded	e	e
   d
e
fdZd	e
d
dfdZd	e
dee
ef   d
dfdZd	e
dee
ef   d
dfdZdee
ef   d
dfdZd	e
d
dfdZd	e
de
d
dfdZy)WebSocketManagerN)session_storesession_controllerattachment_serviceworkflow_run_servicer$   r%   r&   r'   c                p   i | _         i | _        |xs
 t               | _        |xs t	        | j                        | _        |xs
 t               | _        |xs+ t        | j                  | j
                  | j                        | _	        t        | j                  | j
                  | j                        | _        y N)active_connectionsconnection_timestampsr
   r$   r	   r%   r   r&   r   r'   r   message_handler)selfr$   r%   r&   r'   s        r   __init__zWebSocketManager.__init__*   s     9;79"*D.B.D"4"f8RSWSeSe8f"4"K8I8K$8 %
<N####=
!
  .##%% 
r!   	websocket
session_idr   c                 P  K   |j                          d {    |st        t        j                               }|| j                  |<   t        j
                         | j                  |<   t        j                  d|       | j                  |d|ddd       d {    |S 7 7 w)NzWebSocket connected: %s
connection	connected)r0   statustypedata)
acceptr   uuiduuid4r*   timer+   logginginfosend_message)r-   r/   r0   s      r   connectzWebSocketManager.connectB   s        TZZ\*J.7
+15"":..
;$'1[I
 	
 	
  	!	
s"   B&B"BB&B$B&$B&c                 \   | j                   j                  |      }|rI|j                  t        j                  t        j
                  hv r| j                  j                  |d       || j                  v r| j                  |= || j                  v r| j                  |= | j                  j                  |       | j                   j                  |      }|r'|j                  | j                   j                  |       | j                  j                  |       t        j                   d|       y )NzWebSocket disconnected)reasonzWebSocket disconnected: %s)r$   get_sessionr4   r   RUNNINGWAITING_FOR_INPUTr'   request_cancelr*   r+   r%   cleanup_sessionexecutorpop_sessionr&   r<   r=   )r-   r0   sessionremaining_sessions       r   
disconnectzWebSocketManager.disconnectR   s   $$00<w~~-*?*?A`A`)aa%%44/ 5  000''
3333**:6//
; ..:::F!2!;!;!C**:6//
;1:>r!   r   c                   K   || j                   v r3| j                   |   }	 |j                  t        |             d {    y y 7 # t        $ r5}t	        j
                          t        j                  d||       Y d }~y d }~ww xY ww)Nz Failed to send message to %s: %s)r*   	send_textr    r   	traceback	print_excr<   error)r-   r0   r   r/   excs        r   r>   zWebSocketManager.send_messaged   s     000//
;IS))*<W*EFFF 1 G S##%@*cRRSs>   BA AA BA 	B+B ;B BBc                 L   	 t        j                         }|j                         r&t        j                  | j	                  ||             y t        j
                  | j	                  ||             y # t        $ r( t        j
                  | j	                  ||             Y y w xY wr)   )asyncioget_running_loop
is_runningcreate_taskr>   runRuntimeError)r-   r0   r   loops       r   send_message_syncz"WebSocketManager.send_message_syncn   s~    	@++-D ##D$5$5j'$JKD--j'BC 	@KK))*g>?	@s   A	A2 %A2 2.B#"B#c                    K   t        | j                  j                               D ]  }| j                  ||       d {     y 7 wr)   )listr*   keysr>   )r-   r   r0   s      r   	broadcastzWebSocketManager.broadcastx   s=     t66;;=>J##J888 ?8s   <AAAc                    K   || j                   v r2| j                  |ddt        j                         id       d {    y t        j                  d|       y 7 w)Npong	timestampr5   z/Heartbeat request from disconnected session: %s)r*   r>   r;   r<   warning)r-   r0   s     r   handle_heartbeatz!WebSocketManager.handle_heartbeat|   sX     000##+tyy{)CD  
 OOMzZs   ;AAAc           	        K   	 t        j                  |      }| j                  j                  |||        d {    y 7 # t         j                  $ r# | j                  |dddid       d {  7   Y y t        $ rJ}t        j                  d||       | j                  |ddt        |      id       d {  7   Y d }~y d }~ww xY ww)NrP   r   zInvalid JSON formatr5   z"Error handling message from %s: %s)
r   loadsr,   handle_messageJSONDecodeErrorr>   r   r<   rP   r   )r-   r0   r   r7   rQ   s        r   rf   zWebSocketManager.handle_message   s     	::g&D&&55j$MMM## 	## 96K*LM    	MM>
CP## 9c#h*?@  	s_   C5A ?A CA -C.A1/C4C6C>:C8B;9C>CCCr)   )__name__
__module____qualname__r
   r	   r   r   r.   r   r   r   r?   rK   r   r   r>   rZ   r^   rc   rf    r!   r   r#   r#   )   s    6:@D7;:>
 ,d2
 7=	

 .4
 147
0y hsm WZ  ?S ?T ?$SS S4S> Sd S@C @$sCx. @T @9tCH~ 9$ 9[ [ [s S T r!   r#   )__doc__rS   r   r<   r;   rN   r9   typingr   r   r   fastapir   server.services.message_handlerr   "server.services.attachment_servicer   !server.services.session_executionr	   server.services.session_storer
   r   $server.services.workflow_run_servicer   r   r   r    r#   rk   r!   r   <module>rt      sV    7       & &  : @ H M C6 6 6j jr!   