
    2Rj                    @    d dl mZ d dlZd dlZddlmZ  G d d      Zy)    )annotationsN   )WebSocketQueueFullErrorc                  J    e Zd ZdZd
ddZddZddZddZddZddZ	ddZ
y	)	SendQueuezBounded byte-size queue for outgoing WebSocket messages.

    Messages are stored as pre-serialized strings. The queue enforces a
    maximum byte budget so that unbounded buffering cannot occur during
    reconnection windows.
    c                `    g | _         d| _        || _        t        j                         | _        y Nr   )_queue_bytes
_max_bytes	threadingLock_lock)self	max_bytess     Z/var/www/html/meridian/meridian-ai/venv/lib/python3.12/site-packages/openai/_send_queue.py__init__zSendQueue.__init__   s%    -/#^^%
    c                ,   t        |j                  d            }| j                  5  | j                  |z   | j                  kD  rt        d      | j                  j                  ||f       | xj                  |z  c_        ddd       y# 1 sw Y   yxY w)zAppend *data* to the queue.

        Raises :class:`WebSocketQueueFullError` if the message would
        exceed the byte-size limit.
        zutf-8z%send queue is full, message discardedN)lenencoder   r   r   r   r
   append)r   databyte_lengths      r   enqueuezSendQueue.enqueue   sy     $++g./ZZ 	'{{[(4??:-.UVVKKk23KK;&K		' 	' 	's   AB

Bc                   | j                   5  t        | j                        }| j                  j                          d| _        ddd       t              D ]  \  }\  }}	  ||        y# 1 sw Y   )xY w# t        $ r] | j                   5  ||d }|| j                  z   | _        t        d | j                  D              | _        ddd        # 1 sw Y    xY ww xY w)zSend every queued message via *send*.

        If *send* raises, the failing message and all subsequent messages
        are re-queued and the error is re-raised.
        r   Nc              3  &   K   | ]	  \  }}|  y wN .0_bls      r   	<genexpr>z'SendQueue.flush_sync.<locals>.<genexpr>8        %BUQb%B   r   listr
   clearr   	enumerate	Exceptionsumr   sendpendingir   _byte_length	remainings          r   
flush_synczSendQueue.flush_sync&   s     ZZ 	4;;'GKKDK	
 (1'9 	#A#lT
		 	  ZZ C 'I"+dkk"9DK"%%Bdkk%B"BDKC 	C s/   7A,!A8,A58C;C	CCCc                  K   | j                   5  t        | j                        }| j                  j                          d| _        ddd       t              D ]  \  }\  }}	  ||       d{     y# 1 sw Y   1xY w7 # t        $ r] | j                   5  ||d }|| j                  z   | _        t        d | j                  D              | _        ddd        # 1 sw Y    xY ww xY ww)z$Async variant of :meth:`flush_sync`.r   Nc              3  &   K   | ]	  \  }}|  y wr   r   r    s      r   r$   z(SendQueue.flush_async.<locals>.<genexpr>I   r%   r&   r'   r-   s          r   flush_asynczSendQueue.flush_async;   s     ZZ 	4;;'GKKDK	
 (1'9 	#A#l4j  		 	 ! ZZ C 'I"+dkk"9DK"%%Bdkk%B"BDKC 	C s^   C-7A6C-#B.B/B3C-6A?;C-BC*;C	C*C&"C**C-c                    | j                   5  | j                  D cg c]  \  }}|	 }}}| j                  j                          d| _        |cddd       S c c}}w # 1 sw Y   yxY w)z&Remove and return all queued messages.r   N)r   r
   r)   r   )r   r   r"   itemss       r   drainzSendQueue.drainL   s[    ZZ 	)-5gdAT5E5KKDK		 	5	 	s   AA%AAA'c                p    | j                   5  t        | j                        cd d d        S # 1 sw Y   y xY wr   r   r   r
   r   s    r   __len__zSendQueue.__len__T   s*    ZZ 	$t{{#	$ 	$ 	$s   ,5c                v    | j                   5  t        | j                        dkD  cd d d        S # 1 sw Y   y xY wr	   r;   r<   s    r   __bool__zSendQueue.__bool__X   s/    ZZ 	(t{{#a'	( 	( 	(s   /8N)i   )r   intreturnNone)r   strrA   rB   )r.   ztyping.Callable[[str], object]rA   rB   )r.   z0typing.Callable[[str], typing.Awaitable[object]]rA   rB   )rA   z	list[str])rA   r@   )rA   bool)__name__
__module____qualname____doc__r   r   r3   r6   r9   r=   r?   r   r   r   r   r      s*    &'*"$(r   r   )
__future__r   typingr   _exceptionsr   r   r   r   r   <module>rL      s    #   0O( O(r   