§
    	Êj±  ã                  óÌ   — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZmZ ddlmZmZ dZ ej        d	¦  «        Zd
ZdZdd„Zdd„Zdd„Z G d„ d¦  «        ZdS )zÙASGI middleware that writes one request-log row per ``/v1/*`` call.

Implemented as plain ASGI (not ``BaseHTTPMiddleware``) so streamed responses
pass through untouched and latency is measured to the last body chunk.
é    )ÚannotationsN)ÚAny)ÚASGIAppÚMessageÚReceiveÚScopeÚSendé   )Ú
RequestLogÚcurrent_record)z
/v1/media/z+^/v1/(?:images/generations|videos)/([^/]+)$i    i,  Úscoper   Úreturnú
str | Nonec                ó¾  — d„ |                       dg ¦  «        D ¦   «         }|                      dd¦  «                             ¦   «         x}r|S |                      dd¦  «                             d¦  «        d                              ¦   «         x}r|S |                      dd¦  «                             ¦   «         x}r|S |                       d	¦  «        }|r|d         nd
S )zMClient address, honouring the headers set by the Cloudflare tunnel / proxies.c                óf   — i | ].\  }}|                      d ¦  «        |                      d ¦  «        “Œ/S )úlatin-1)Údecode)Ú.0ÚkÚvs      ú3C:\Projects\Muse2API\src\muse2api\api\middleware.pyú
<dictcomp>zclient_ip.<locals>.<dictcomp>   s6   € Ð]Ð]Ð]¹D¸A¸qˆq�xŠx˜	Ñ"Ô" A§H¢H¨YÑ$7Ô$7Ð]Ð]Ð]ó    Úheaderszcf-connecting-ipÚ zx-forwarded-forú,r   z	x-real-ipÚclientN)ÚgetÚstripÚsplit)r   r   ÚipÚfwdr   s        r   Ú	client_ipr#      sá   € à]Ð]ÀEÇIÂIÈiÐY[ÑD\ÔD\Ð]Ñ]Ô]€GØ�[Š[Ð+¨RÑ0Ô0×6Ò6Ñ8Ô8Ð8€rð Øˆ	Ø�kŠkÐ+¨RÑ0Ô0×6Ò6°sÑ;Ô;¸AÔ>×DÒDÑFÔFÐF€sð Øˆ
Ø�[Š[˜ bÑ)Ô)×/Ò/Ñ1Ô1Ð1€rð Øˆ	Ø�YŠY�xÑ Ô €FØÐ(ˆ6�!Œ9ˆ9 DÐ(r   ÚbodyÚbytesc                óÚ  — 	 t          j        | ¦  «        }nI# t          $ r< |                      dd¦  «                             ¦   «         }|d t
          …         pd cY S w xY wt          |t          ¦  «        sd S |                     d¦  «        }t          |t          ¦  «        r|                     d¦  «        n|p|                     d¦  «        }|rt          |¦  «        d t
          …         nd S )Nzutf-8ÚreplaceÚerrorÚmessageÚdetail)
ÚjsonÚloadsÚ
ValueErrorr   r   Ú_MAX_ERROR_LENÚ
isinstanceÚdictr   Ústr)r$   ÚdataÚtextÚerrÚmsgs        r   Ú_error_messager6   )   së   € ð-ÝŒz˜$ÑÔˆˆøÝð -ð -ð -Ø�{Š{˜7 IÑ.Ô.×4Ò4Ñ6Ô6ˆØ�O•^�OÔ$Ð,¨Ð,Ð,Ð,ð-øøøõ �d�DÑ!Ô!ð ØˆtØ
�(Š(�7Ñ
Ô
€CÝ *¨3µÑ 5Ô 5Ð
Tˆ#�'Š'�)Ñ
Ô
Ð
¸3Ð;TÀ$Ç(Â(È8ÑBTÔBT€CØ(+Ð5�3ˆs‰8Œ8�O•^�OÔ$Ð$°Ð5s   ‚ —AAÁAÚchunkc                ó’   — |                       d¦  «        D ]0}|                     d¦  «        rt          |dd…         ¦  «        c S Œ1dS )zCError event emitted mid-stream (the status is already 200 by then).ó   
s   data: {"error"é   N)r    Ú
startswithr6   )r7   Úlines     r   Ú
_sse_errorr=   6   sX   € à—’˜EÑ"Ô"ð ,ð ,ˆØ�?Š?Ð,Ñ-Ô-ð 	,Ý! $ q r r¤(Ñ+Ô+Ð+Ð+Ð+ð	,àˆ4r   c                  ó   — e Zd Zdd„Zdd„ZdS )ÚRequestLogMiddlewareÚappr   Úrequest_logr   r   ÚNonec                óH   — || _         || _        t          ¦   «         | _        d S )N)r@   rA   ÚsetÚ_pending)Úselfr@   rA   s      r   Ú__init__zRequestLogMiddleware.__init__?   s    € ØˆŒØ&ˆÔÝ+.©5¬5ˆŒˆˆr   r   r   Úreceiver   Úsendr	   c           
   ƒ  ój  ‡‡‡K  — |d         dk    r|                      dd¦  «        nd}|                     d¦  «        r|                     t          ¦  «        r|                      ||‰¦  «        ƒ d {V —† d S t	          j        ¦   «         }|                     di ¦  «        }|d         dk    rt                               |¦  «        nd }t	          j        ¦   «         |d         |t          t          |¦  «        ¦  «        |r|                     d	¦  «        nd d
dt          |¦  «        dœŠ|                      dg ¦  «        D ]+\  }}	|dk    r |	                     d¦  «        d d…         ‰d<   Œ,t          ¦   «         Šdˆˆˆfd„}
t          j        ‰¦  «        }	 |                      |||
¦  «        ƒ d {V —† nK# t"          $ r>}d
‰d<   t%          |¦  «        pt'          |¦  «        j        d t*          …         ‰d<   ‚ d }~ww xY w	 t          j        |¦  «         t          t	          j        ¦   «         |z
  dz  ¦  «        ‰d<   ‰r4‰                      d¦  «        st/          t1          ‰¦  «        ¦  «        ‰d<   dD ]"}|                      |¦  «        �||         ‰|<   Œ#t3          j        | j                             ‰¦  «        ¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         t3          j         |¦  «        ƒ d {V —† d S # t          j        |¦  «         t          t	          j        ¦   «         |z
  dz  ¦  «        ‰d<   ‰r4‰                      d¦  «        st/          t1          ‰¦  «        ¦  «        ‰d<   dD ]"}|                      |¦  «        �||         ‰|<   Œ#t3          j        | j                             ‰¦  «        ¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         t3          j         |¦  «        ƒ d {V —† w xY w)NÚtypeÚhttpÚpathr   z/v1/ÚstateÚmethodÚGETé   iô  r   )ÚtsrO   rM   ÚpollÚtask_idÚstatus_codeÚstreamr#   r   s
   user-agentr   éÈ   Ú
user_agentr)   r   r   rB   c              “  óR  •K  — | d         dk    rZ| d         ‰d<   |                       dg ¦  «        D ]7\  }}|                     ¦   «         dk    r|                     d¦  «        rd‰d	<   Œ8n¬| d         d
k    r |                       dd¦  «        }‰d         dk    rKt          ‰¦  «        t          k     r2‰                     |d t          t          ‰¦  «        z
  …         ¦  «         n3‰d	         r+‰                      d¦  «        sd|v rt          |¦  «        ‰d<    ‰| ¦  «        ƒ d {V —† d S )NrK   zhttp.response.startÚstatusrU   r   s   content-types   text/event-streamrQ   rV   zhttp.response.bodyr$   r   i�  r(   s   "error")r   Úlowerr;   ÚlenÚ_MAX_ERROR_BODYÚextendr=   )r)   r   r   r$   Ú
error_bodyÚrecordrI   s       €€€r   Úsend_wrapperz3RequestLogMiddleware.__call__.<locals>.send_wrapper]   sO  øè è € Ø�vŒÐ"7Ò7Ð7Ø(/°Ô(9��}Ñ%Ø#ŸKšK¨	°2Ñ6Ô6ð -ð -‘D�A�qØ—w’w‘y”y OÒ3Ð3¸¿ºÐEYÑ8ZÔ8ZÐ3Ø+,˜˜xÑ(øð-ð ˜”Ð$8Ò8Ð8Ø—{’{ 6¨3Ñ/Ô/�Ø˜-Ô(¨CÒ/Ð/Ý˜:‘”­Ò8Ð8Ø"×)Ò)¨$Ð/RµÅ3ÀzÁ?Ä?Ñ1RÐ/RÔ*SÑTÔTÐTøØ˜HÔ%ð 7¨f¯jªj¸Ñ.AÔ.Að 7ÀjÐTXÐFXÐFXÝ&0°Ñ&6Ô&6�F˜7‘OØ�$�w‘-”-ÐÐÐÐÐÐÐÐÐr   rU   r(   iè  Ú
latency_ms)ÚmodelÚkey_idÚkey_namerT   )r)   r   r   rB   )!r   r;   Ú_SKIP_PREFIXESr@   ÚtimeÚperf_counterÚ
setdefaultÚ_POLL_REÚmatchÚintÚboolÚgroupr#   r   Ú	bytearrayr   rD   Ú	Exceptionr1   rK   Ú__name__r.   Úresetr6   r%   ÚasyncioÚcreate_taskrA   ÚaddrE   Úadd_done_callbackÚdiscardÚshield)rF   r   rH   rI   rM   ÚstartedrN   rS   r   r   ra   ÚtokenÚexcÚfieldÚtaskr_   r`   s      `           @@r   Ú__call__zRequestLogMiddleware.__call__D   sd  øøøè è € Ø(-¨f¬¸Ò(?Ð(?ˆu�yŠy˜ Ñ$Ô$Ð$ÀRˆØ�Š˜vÑ&Ô&ð 	¨$¯/ª/½.Ñ*IÔ*Ið 	Ø—(’(˜5 '¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØˆFåÔ#Ñ%Ô%ˆà %× 0Ò 0°¸"Ñ =Ô =ˆØ',¨X¤¸%Ò'?Ð'?�x�~Š~˜dÑ#Ô#Ð#ÀTˆå”)‘+”+Ø˜H”oØÝ�˜T™
œ
‘O”OØ(,Ð6�t—z’z !‘}”}�}°$ØØÝ" 5Ñ)Ô)ð	"
ð 	"
ˆð —I’I˜i¨Ñ,Ô,ð 	Að 	A‰DˆAˆqØ�MÒ!Ð!Ø'(§x¢x°	Ñ':Ô':¸4¸C¸4Ô'@��|Ñ$øÝ‘[”[ˆ
ð	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 õ Ô" 6Ñ*Ô*ˆð	'Ø—(’(˜5 '¨<Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8øÝð 	ð 	ð 	Ø$'ˆF�=Ñ!Ý" 3™xœxÐ=­4°©9¬9Ô+=¸Å¸ÔOˆF�7‰OØøøøøð	øøøð 9õ Ô  Ñ'Ô'Ð'Ý#&­Ô(9Ñ(;Ô(;¸gÑ(EÈÑ'MÑ#NÔ#NˆF�<Ñ Øð D &§*¢*¨WÑ"5Ô"5ð DÝ"0µ°zÑ1BÔ1BÑ"CÔ"C��w‘ØCð 1ð 1�Ø—9’9˜UÑ#Ô#Ð/Ø$)¨%¤L�F˜5‘MøåÔ& tÔ'7×';Ò';¸FÑ'CÔ'CÑDÔDˆDØŒM×Ò˜dÑ#Ô#Ð#Ø×"Ò" 4¤=Ô#8Ñ9Ô9Ð9Ý”. Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øõ Ô  Ñ'Ô'Ð'Ý#&­Ô(9Ñ(;Ô(;¸gÑ(EÈÑ'MÑ#NÔ#NˆF�<Ñ Øð D &§*¢*¨WÑ"5Ô"5ð DÝ"0µ°zÑ1BÔ1BÑ"CÔ"C��w‘ØCð 1ð 1�Ø—9’9˜UÑ#Ô#Ð/Ø$)¨%¤L�F˜5‘MøåÔ& tÔ'7×';Ò';¸FÑ'CÔ'CÑDÔDˆDØŒM×Ò˜dÑ#Ô#Ð#Ø×"Ò" 4¤=Ô#8Ñ9Ô9Ð9Ý”. Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøs+   ÆF4 Æ3L Æ4
G<Æ>9G7Ç7G<Ç<L ÌDP2N)r@   r   rA   r   r   rB   )r   r   rH   r   rI   r	   r   rB   )rq   Ú
__module__Ú__qualname__rG   r~   © r   r   r?   r?   >   s<   € € € € € ð1ð 1ð 1ð 1ð
;'ð ;'ð ;'ð ;'ð ;'ð ;'r   r?   )r   r   r   r   )r$   r%   r   r   )r7   r%   r   r   )Ú__doc__Ú
__future__r   rs   r+   Úrerg   Útypingr   Ústarlette.typesr   r   r   r   r	   Úservices.request_logr   r   rf   Úcompilerj   r]   r.   r#   r6   r=   r?   r�   r   r   ú<module>r‰      s6  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bà =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð !€àˆ2Œ:ÐDÑEÔE€à€Ø€ð
)ð 
)ð 
)ð 
)ð
6ð 
6ð 
6ð 
6ðð ð ð ðA'ð A'ð A'ð A'ð A'ñ A'ô A'ð A'ð A'ð A'r   