o
    .j                     @  s   d dl mZ d dlZd dlZd dlmZ zddlmZ W n ey+   ddl	m
Z Y nw zd dlmZ W n ey?   dZY nw G dd	 d	eZdS )
    )annotationsN)create_proxy   )AsyncWebSocketExtensionFromHTTP)AsyncRawExtensionFromHTTP)	WebSocketc                   @  sZ   e Zd ZdZdddZddd	ZedddZdddZdddZ	dddZ
dddZdS )AsyncPyodideWebSocketExtensionzAsync WebSocket extension for Pyodide using the browser's native WebSocket API.

    Messages are queued from JS callbacks and dequeued by next_payload()
    which awaits until a message arrives.
    returnNonec                 C  s    d| _ t | _g | _d | _d S )NF)_closedasyncioQueue_queue_proxies_wsself r   [/home/thesage/.local/lib/python3.10/site-packages/niquests/extensions/pyodide/_async/_ws.py__init__   s   

z'AsyncPyodideWebSocketExtension.__init__urlstrc           
        s   t du r	tdt }|  t |_dj_d fdd	}d fd
d}dfdd}dfdd}d|fd|fd|fd|ffD ]\}}t|}	j	
|	 tj||	 qE I dH  dS )z8Open the WebSocket connection and wait until it's ready.NzoWebSocket is not available in this JavaScript runtime. Browser environment required (not supported in Node.js).arraybufferevent
typing.Anyr	   r
   c                   s      s d  d S d S N)done
set_resultr   open_futurer   r   _onopen2   s   z5AsyncPyodideWebSocketExtension.start.<locals>._onopenc                   s      s td d S d S )NzWebSocket connection failed)r   set_exceptionConnectionErrorr   r   r   r   _onerror6   s   z6AsyncPyodideWebSocketExtension.start.<locals>._onerrorc                   s8   | j }t|tr j| d S  jt|  d S r   )data
isinstancer   r   
put_nowaitbytesto_py)r   r%   r   r   r   
_onmessage:   s   
z8AsyncPyodideWebSocketExtension.start.<locals>._onmessagec                   s    j d  d S r   )r   r'   r   r   r   r   _oncloseB   s   z6AsyncPyodideWebSocketExtension.start.<locals>._oncloseonopenonerror	onmessageonclose)r   r   r	   r
   )JSWebSocketOSErrorr   get_running_loopcreate_futurenewr   
binaryTyper   r   appendsetattr)
r   r   loopr!   r$   r*   r+   namefnproxyr   )r    r   r   start"   s,   z$AsyncPyodideWebSocketExtension.startboolc                 C  s   | j S r   )r   r   r   r   r   closedQ   s   z%AsyncPyodideWebSocketExtension.closedstr | bytes | Nonec                   s2   | j rtd| j I dH }|du rd| _ |S )zjAwait the next message from the WebSocket.
        Returns None when the remote end closes the connection.!The WebSocket extension is closedNT)r   r1   r   get)r   msgr   r   r   next_payloadU   s   z+AsyncPyodideWebSocketExtension.next_payloadbufstr | bytesc                   sP   | j rtdt|ttfr ddlm} | j|	| dS | j| dS )z"Send a message over the WebSocket.r@   r   )
Uint8ArrayN)
r   r1   r&   r(   	bytearrayjsrF   r   sendr4   )r   rD   rF   r   r   r   send_payloadb   s   z+AsyncPyodideWebSocketExtension.send_payloadc                   s   dS )u@   No-op — browser WebSocket handles ping/pong at protocol level.Nr   r   r   r   r   pingn   s   z#AsyncPyodideWebSocketExtension.pingc              	     sl   | j rdS d| _ z| j  W n	 ty   Y nw | jD ]}z|  W q ty.   Y qw | j  dS )z)Close the WebSocket and clean up proxies.NT)r   r   close	Exceptionr   destroyclear)r   r;   r   r   r   rL   r   s    
z$AsyncPyodideWebSocketExtension.closeN)r	   r
   )r   r   r	   r
   )r	   r=   )r	   r?   )rD   rE   r	   r
   )__name__
__module____qualname____doc__r   r<   propertyr>   rC   rJ   rK   rL   r   r   r   r   r      s    

/


r   )
__future__r   r   typingpyodide.ffir   0packages.urllib3.contrib.webextensions._async.wsr   ImportError1packages.urllib3.contrib.webextensions._async.rawr   rH   r   r0   r   r   r   r   r   <module>   s    