Ë
    täià[  ã                  óX  — U d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlZddlmZmZmZmZ e
rddlmZ d	d
lmZ d	dlmZ 	 dZdZdZdZdZ G d„ de«      Z G d„ de«      Z G d„ de«      Z d0d„Z! G d„ dejD                  «      Z# G d„ d«      Z$ G d„ dejD                  «      Z%d1d„Z&d1d„Z'd1d „Z(d1d!„Z)dZ*d"e+d#<    e)«       r e'«       r e&«       s e(«       s e$«       Z*ndZ*d$Z,d2d%„Z-d&a.d3d'„Z/d&a0d3d(„Z1d4d)„Z2	 	 	 	 	 	 d5d*„Z3	 	 	 	 	 	 	 	 	 	 	 	 d6d+„Z4d1d,„Z5d1d-„Z6d7d.„Z7d1d/„Z8y)8aä  
Support for streaming http requests in emscripten.

A few caveats -

If your browser (or Node.js) has WebAssembly JavaScript Promise Integration enabled
https://github.com/WebAssembly/js-promise-integration/blob/main/proposals/js-promise-integration/Overview.md
*and* you launch pyodide using `pyodide.runPythonAsync`, this will fetch data using the
JavaScript asynchronous fetch api (wrapped via `pyodide.ffi.call_sync`). In this case
timeouts and streaming should just work.

Otherwise, it uses a combination of XMLHttpRequest and a web-worker for streaming.

This approach has several caveats:

Firstly, you can't do streaming http in the main UI thread, because atomics.wait isn't allowed.
Streaming only works if you're running pyodide in a web worker.

Secondly, this uses an extra web worker and SharedArrayBuffer to do the asynchronous fetch
operation, so it requires that you have crossOriginIsolation enabled, by serving over https
(or from localhost) with the two headers below set:

    Cross-Origin-Opener-Policy: same-origin
    Cross-Origin-Embedder-Policy: require-corp

You can tell if cross origin isolation is successfully enabled by looking at the global crossOriginIsolated variable in
JavaScript console. If it isn't, streaming requests will fallback to XMLHttpRequest, i.e. getting the whole
request into a buffer and then returning it. it shows a warning in the JavaScript console in this case.

Finally, the webworker which does the streaming fetch is created on initial import, but will only be started once
control is returned to javascript. Call `await wait_for_streaming_ready()` to wait for streaming fetch.

NB: in this code, there are a lot of JavaScript objects. They are named js_*
to make it clear what type of object they are.
é    )ÚannotationsN)ÚParser)Úfiles)ÚTYPE_CHECKINGÚAny)ÚJsArrayÚJsExceptionÚJsProxyÚto_js)ÚBufferé   )ÚEmscriptenRequest)ÚEmscriptenResponse)z
user-agentéÿÿÿÿéþÿÿÿéýÿÿÿéüÿÿÿc                  ó6   ‡ — e Zd Z	 ddddœ	 	 	 	 	 dˆ fd„Zˆ xZS )Ú_RequestErrorN©ÚrequestÚresponsec               ób   •— || _         || _        || _        t        ‰| �  | j                  «       y ©N)r   r   ÚmessageÚsuperÚ__init__)Úselfr   r   r   Ú	__class__s       €úo/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.pyr   z_RequestError.__init__H   s+   ø€ ð ˆŒØ ˆŒØˆŒÜ‰Ñ˜Ÿ™Õ&ó    r   )r   z
str | Noner   úEmscriptenRequest | Noner   úEmscriptenResponse | None)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__©r   s   @r    r   r   G   s;   ø„ ð #ð
'ð -1Ø.2ñ
'àð
'ð *ð	
'ð
 ,÷
'ñ 
'r!   r   c                  ó   — e Zd Zy)Ú_StreamingErrorN©r$   r%   r&   © r!   r    r*   r*   U   ó   „ Ør!   r*   c                  ó   — e Zd Zy)Ú_TimeoutErrorNr+   r,   r!   r    r/   r/   Y   r-   r!   r/   c                óL   — t        | t        j                  j                  ¬«      S )N)Údict_converter)r   ÚjsÚObjectÚfromEntries)Údict_vals    r    Ú_obj_from_dictr6   ]   s   € Ü�¬"¯)©)×*?Ñ*?Ô@Ð@r!   c                  ó‚   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 d
d„Zdd„Zdd„Zedd„«       Zdˆ fd„Zdd„Z	dd„Z
dd„Zdd	„Zˆ xZS )Ú_ReadStreamc                ó¶   — || _         || _        d| _        d| _        || _        || _        |dkD  rt        d|z  «      nd | _        d| _        d| _	        || _
        y )Nr   éè  TF)Ú
int_bufferÚbyte_bufferÚread_posÚread_lenÚconnection_idÚworkerÚintÚtimeoutÚis_liveÚ
_is_closedr   )r   r;   r<   rB   r@   r?   r   s          r    r   z_ReadStream.__init__b   s]   € ð %ˆŒØ&ˆÔØˆŒØˆŒØ*ˆÔØˆŒØ.5¸ªk”s˜4 '™>Ô*¸tˆŒØˆŒØˆŒØ18ˆ�r!   c                ó$   — | j                  «        y r   ©Úclose©r   s    r    Ú__del__z_ReadStream.__del__v   ó   € Ø�
‰
�r!   c                ó   — | j                   S r   ©rD   rH   s    r    Ú	is_closedz_ReadStream.is_closedz   ó   € Ø�‰Ðr!   c                ó"   — | j                  «       S r   ©rM   rH   s    r    Úclosedz_ReadStream.closed~   ó   € à�~‰~ÓÐr!   c                ó  •— | j                  «       ry d| _        d| _        d | _        d | _        d| _        d | _        | j                  r7| j                  j                  t        d| j                  i«      «       d| _        t        ‰| �5  «        y )Nr   TrG   F)rM   r>   r=   r;   r<   rD   r   rC   r@   ÚpostMessager6   r?   r   rG   ©r   r   s    €r    rG   z_ReadStream.close‚   st   ø€ Ø�>‰>ÔØØˆŒØˆŒØˆŒØˆÔØˆŒØˆŒØ�<Š<Ø�K‰K×#Ñ#¤N°G¸T×=OÑ=OÐ3PÓ$QÔRØ ˆDŒLÜ‰‰�r!   c                 ó   — y©NTr,   rH   s    r    Úreadablez_ReadStream.readable�   ó   € Ør!   c                 ó   — y©NFr,   rH   s    r    Úwritablez_ReadStream.writable“   ó   € Ør!   c                 ó   — yr[   r,   rH   s    r    Úseekablez_ReadStream.seekable–   r]   r!   c                ób  — | j                   st        d| j                  d ¬«      ‚| j                  dk(  �rYt        j
                  j                  | j                   dt        «       | j                  j                  t        d| j                  i«      «       t        j
                  j                  | j                   dt        | j                  «      dk(  rt        ‚| j                   d   }|dkD  r|| _        d| _        n”|t         k(  rs| j                   d   }t        j"                  j%                  «       }|j'                  | j(                  j+                  d|«      «      }t        d|› �| j                  d ¬«      ‚d| _        | j/                  «        yt1        | j                  t3        t5        |«      «      «      }| j(                  j7                  | j                  | j                  |z   «      j9                  «       }|t5        |«      d| | xj                  |z  c_        | xj                  |z  c_        |S )	Nz,No buffer for stream in _ReadStream.readintor   r   ÚgetMorez	timed-outr   úException thrown in fetch: F)r;   r*   r   r>   r2   ÚAtomicsÚstoreÚERROR_TIMEOUTr@   rT   r6   r?   ÚwaitrB   r/   r=   ÚERROR_EXCEPTIONÚTextDecoderÚnewÚdecoder<   ÚslicerC   rG   ÚminÚlenÚ
memoryviewÚsubarrayÚto_py)r   Úbyte_objÚdata_lenÚ
string_lenÚ
js_decoderÚjson_strÚ
ret_lengthro   s           r    Úreadintoz_ReadStream.readinto™   sÀ  € Ø�ŠÜ!Ø>ØŸ™Øôð ð
 �=‰=˜AÓä�J‰J×Ñ˜TŸ_™_¨a´Ô?Ø�K‰K×#Ñ#¤N°I¸t×?QÑ?QÐ3RÓ$SÔTä—
‘
—‘ §¡°´MÀ4Ç<Á<ÓPØòô $Ð#Ø—‘ qÑ)ˆHØ˜!Š|Ø (�”Ø !�•Øœ_Ò,Ø!Ÿ_™_¨QÑ/�
äŸ^™^×/Ñ/Ó1�
Ø%×,Ñ,¨T×-=Ñ-=×-CÑ-CÀAÀzÓ-RÓS�Ü%Ø1°(°Ð<Ø ŸL™LØ!ôð ð  %�”Ø—
‘
”Øä˜Ÿ™¬¬J°xÓ,@Ó(AÓBˆ
Ø×#Ñ#×,Ñ,Ø�M‰M˜4Ÿ=™=¨:Ñ5ó
ç
‰%‹'ð 	ð .6Œ
�8Ó˜Q˜zÐ*Ø�Š˜Ñ#�Ø�Š˜Ñ#�ØÐr!   )r;   r   r<   r   rB   Úfloatr@   r
   r?   rA   r   r   ©ÚreturnÚNone©rz   Úbool©rq   r   rz   rA   )r$   r%   r&   r   rI   rM   ÚpropertyrQ   rG   rX   r\   r_   rw   r'   r(   s   @r    r8   r8   a   sy   ø„ ð9àð9ð ð9ð ð	9ð
 ð9ð ð9ð #ó9ó(óð ò ó ð õóóó÷,r!   r8   c                  ó   — e Zd Zdd„Zdd„Zy)Ú_StreamingFetcherc                óà  ‡ — d‰ _         t        t        «      j                  d«      j	                  d¬«      }t
        j                  j                  t        |gd¬«      t        ddi«      «      }d	ˆ fd„}t
        j                  j                  |«      }t
        j                  j                  j                  |«      ‰ _        t
        j                  j                  j                  |«      ‰ _        y )
NFzemscripten_fetch_worker.jszutf-8)Úencoding)Úcreate_pyproxiesÚtypezapplication/javascriptc                óh   •‡ ‡— dˆ ˆfd„}dˆfd„}|‰j                   _        |‰j                   _        y )Nc                ó$   •— d‰_          ‰| «       y rW   )Ústreaming_ready)ÚeÚjs_resolve_fnr   s    €€r    ÚonMsgzC_StreamingFetcher.__init__.<locals>.promise_resolver.<locals>.onMsg×   s   ø€ Ø'+�Ô$Ù˜aÕ r!   c                ó   •—  ‰| «       y r   r,   )r‰   Újs_reject_fns    €r    ÚonErrzC_StreamingFetcher.__init__.<locals>.promise_resolver.<locals>.onErrÛ   s
   ø€ Ù˜Q•r!   )r‰   r
   rz   r{   )Ú	js_workerÚ	onmessageÚonerror)rŠ   r�   r‹   rŽ   r   s   ``  €r    Úpromise_resolverz4_StreamingFetcher.__init__.<locals>.promise_resolverÖ   s'   ú€ ö!õ ð (-ˆD�N‰NÔ$Ø%*ˆD�N‰NÕ"r!   )rŠ   r
   r�   r
   rz   r{   )rˆ   r   Ú__package__ÚjoinpathÚ	read_textr2   ÚBlobri   r   r6   ÚURLÚcreateObjectURLÚ
globalThisÚWorkerr�   ÚPromiseÚjs_worker_ready_promise)r   Ústreaming_worker_codeÚjs_data_blobr’   Újs_data_urls   `    r    r   z_StreamingFetcher.__init__É   s´   ø€ à$ˆÔä”+Óß‰XÐ2Ó3ß‰Y ˆYÓ(ð 	ô
 —w‘w—{‘{ÜÐ(Ð)¸EÔBÜ˜FÐ$<Ð=Ó>ó
ˆõ
		+ô —f‘f×,Ñ,¨\Ó:ˆÜŸ™×-Ñ-×1Ñ1°+Ó>ˆŒÜ')§}¡}×'<Ñ'<×'@Ñ'@ÐAQÓ'RˆÕ$r!   c                óØ  — |j                   j                  «       D ��ci c]  \  }}|t        vsŒ||“Œ }}}|j                  }|t	        |«      |j
                  dœ}|j                  dkD  rt        d|j                  z  «      nd }t        j                  j                  d«      }t        j                  j                  |«      }	t        j                  j                  |d«      }
t        j                  j                  |	dt        «       t        j                  j!                  |	d«       t        j"                  j                  |j$                  t        j&                  «      j(                  }| j*                  j-                  t/        |||dœ«      «       t        j                  j1                  |	dt        |«       |	d   t        k(  rt3        d|d ¬«      ‚|	d   t4        k(  r“|	d	   }t        j6                  j                  «       }|j9                  |
j;                  d|«      «      }t=        j>                  |«      }tA        ||d
   |d   tC        |	|
|j                  | j*                  |d   |«      ¬«      S |	d   tD        k(  rU|	d	   }t        j6                  j                  «       }|j9                  |
j;                  d|«      «      }tG        d|› �|d ¬«      ‚tG        d|	d   › �|d ¬«      ‚c c}}w )N)ÚheadersÚbodyÚmethodr   r:   i   é   )ÚbufferÚurlÚfetchParamsz'Timeout connecting to streaming requestr   r   Ústatusr¡   ÚconnectionID)r   Ústatus_coder¡   r¢   rb   z%Unknown status from worker in fetch: )$r¡   ÚitemsÚHEADERS_TO_IGNOREr¢   r   r£   rB   rA   r2   ÚSharedArrayBufferri   Ú
Int32ArrayÚ
Uint8Arrayrc   rd   re   Únotifyr—   r¦   ÚlocationÚhrefr�   rT   r6   rf   r/   ÚSUCCESS_HEADERrh   rj   rk   ÚjsonÚloadsr   r8   rg   r*   )r   r   ÚkÚvr¡   r¢   Ú
fetch_datarB   Újs_shared_bufferÚjs_int_bufferÚjs_byte_bufferÚjs_absolute_urlrs   rt   ru   Úresponse_objs                   r    Úsendz_StreamingFetcher.sendå   s�  € à$Ÿ_™_×2Ñ2Ô4ô
Ù4‘T�Q˜¸ÔARÒ8RˆAˆq‰DÐ4ð 	ñ 
ð �|‰|ˆØ!(´%¸³+ÈÏÉÑXˆ
à18·±À1Ò1D”#�d˜WŸ_™_Ñ,Ô-È$ˆÜ×/Ñ/×3Ñ3°GÓ<ÐÜŸ™×)Ñ)Ð*:Ó;ˆÜŸ™×*Ñ*Ð+;¸QÓ?ˆä
�
‰
×Ñ˜¨¬=Ô9Ü
�
‰
×Ñ˜-¨Ô+ÜŸ&™&Ÿ*™* W§[¡[´"·+±+Ó>×CÑCˆØ�‰×"Ñ"Üà.Ø*Ø#-ñóô	
ô 	�
‰
�‰˜ q¬-¸ÔAØ˜Ñœ}Ò,ÜØ9ØØôð ð
 ˜1Ñ¤Ò/ð ' qÑ)ˆJäŸ™×+Ñ+Ó-ˆJð "×(Ñ(¨×)=Ñ)=¸aÀÓ)LÓMˆHäŸ:™: hÓ/ˆLÜ%ØØ(¨Ñ2Ø$ YÑ/Ü Ø!Ø"Ø—O‘OØ—N‘NØ  Ñ0Øóô	ð ð ˜1Ñ¤Ò0Ø& qÑ)ˆJäŸ™×+Ñ+Ó-ˆJØ!×(Ñ(¨×)=Ñ)=¸aÀÓ)LÓMˆHÜ!Ø-¨h¨ZÐ8À'ÐTXôð ô "Ø7¸ÀaÑ8HÐ7IÐJØØôð ùóC
s
   žK&¯K&Nry   ©r   r   rz   r   )r$   r%   r&   r   r¾   r,   r!   r    r�   r�   È   s   „ óSô8Fr!   r�   c                  óŠ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zedd„«       Zdˆ fd„Z	dd„Z
dd„Zdd	„Zdd
„Zdd„Zˆ xZS )Ú_JSPIReadStreamaF  
    A read stream that uses pyodide.ffi.run_sync to read from a JavaScript fetch
    response. This requires support for WebAssembly JavaScript Promise Integration
    in the containing browser, and for pyodide to be launched via runPythonAsync.

    :param js_read_stream:
        The JavaScript stream reader

    :param timeout:
        Timeout in seconds

    :param request:
        The request we're handling

    :param response:
        The response this stream relates to

    :param js_abort_controller:
        A JavaScript AbortController object, used for timeouts
    c                ó‚   — || _         || _        d| _        d| _        || _        || _        d | _        d| _        || _        y )NFr   )	Újs_read_streamrB   rD   Ú_is_doner   r   Úcurrent_bufferÚcurrent_buffer_posÚjs_abort_controller)r   rÃ   rB   r   r   rÇ   s         r    r   z_JSPIReadStream.__init__D  sG   € ð -ˆÔØˆŒØˆŒØˆŒØ18ˆŒØ3;ˆŒØ"ˆÔØ"#ˆÔØ#6ˆÕ r!   c                ó$   — | j                  «        y r   rF   rH   s    r    rI   z_JSPIReadStream.__del__V  rJ   r!   c                ó   — | j                   S r   rL   rH   s    r    rM   z_JSPIReadStream.is_closedZ  rN   r!   c                ó"   — | j                  «       S r   rP   rH   s    r    rQ   z_JSPIReadStream.closed^  rR   r!   c                óÚ   •— | j                  «       ry d| _        d| _        | j                  j	                  «        d | _        d| _        d| _        d | _        d | _        t        ‰| �)  «        y )Nr   T)rM   r>   r=   rÃ   ÚcancelrD   rÄ   r   r   r   rG   rU   s    €r    rG   z_JSPIReadStream.closeb  s]   ø€ Ø�>‰>ÔØØˆŒØˆŒØ×Ñ×"Ñ"Ô$Ø"ˆÔØˆŒØˆŒØˆŒØˆŒÜ‰‰�r!   c                 ó   — yrW   r,   rH   s    r    rX   z_JSPIReadStream.readableo  rY   r!   c                 ó   — yr[   r,   rH   s    r    r\   z_JSPIReadStream.writabler  r]   r!   c                 ó   — yr[   r,   rH   s    r    r_   z_JSPIReadStream.seekableu  r]   r!   c                ó  — t        | j                  j                  «       | j                  | j                  | j
                  | j                  ¬«      }|j                  rd| _        y|j                  j                  «       | _        d| _        y)Nr   TFr   )Ú_run_sync_with_timeoutrÃ   ÚreadrB   rÇ   r   r   ÚdonerÄ   Úvaluerp   rÅ   rÆ   )r   Ú	result_jss     r    Ú_get_next_bufferz _JSPIReadStream._get_next_bufferx  so   € Ü*Ø×Ñ×$Ñ$Ó&Ø�L‰LØ×$Ñ$Ø—L‘LØ—]‘]ô
ˆ	ð �>Š>Ø ˆDŒMØà"+§/¡/×"7Ñ"7Ó"9ˆDÔØ&'ˆDÔ#Ør!   c                ó°  — | j                   €-| j                  «       r| j                   €| j                  «        yt        t	        |«      t	        | j                   «      | j
                  z
  «      }| j                   | j
                  | j
                  |z    |d| | xj
                  |z  c_        | j
                  t	        | j                   «      k(  rd | _         |S )Nr   )rÅ   rÖ   rG   rl   rm   rÆ   )r   rq   rv   s      r    rw   z_JSPIReadStream.readintoˆ  sÃ   € Ø×ÑÐ&Ø×(Ñ(Ô*¨d×.AÑ.AÐ.IØ—
‘
”ØÜÜ�‹Mœ3˜t×2Ñ2Ó3°d×6MÑ6MÑMó
ˆ
ð "&×!4Ñ!4Ø×#Ñ# d×&=Ñ&=À
Ñ&Jð"
ˆ��:Ðð 	×Ò :Ñ-ÕØ×"Ñ"¤c¨$×*=Ñ*=Ó&>Ò>Ø"&ˆDÔØÐr!   )
rÃ   r   rB   rx   r   r   r   r   rÇ   r   ry   r|   r~   )r$   r%   r&   Ú__doc__r   rI   rM   r   rQ   rG   rX   r\   r_   rÖ   rw   r'   r(   s   @r    rÁ   rÁ   .  sy   ø„ ñð*7àð7ð ð7ð #ð	7ð
 %ð7ð !ó7ó$óð ò ó ð õóóóó÷ r!   rÁ   c                 óŒ   — t        t        d«      xr3 t        t        d«      xr! t        j                  t        j                  k(  S )NÚwindowr   )Úhasattrr2   r   rÚ   r,   r!   r    Úis_in_browser_main_threadrÜ   š  s-   € Ü”2�xÓ ÒQ¤W¬R°Ó%8ÒQ¼R¿W¹WÌÏ	É	Ñ=QÐQr!   c                 óF   — t        t        d«      xr t        j                  S )NÚcrossOriginIsolated)rÛ   r2   rÞ   r,   r!   r    Úis_cross_origin_isolatedrß   ž  s   € Ü”2Ð,Ó-ÒH´"×2HÑ2HÐHr!   c                 óø   — t        t        d«      xri t        t        j                  d«      xrM t        t        j                  j                  d«      xr' t        j                  j                  j                  dk(  S )NÚprocessÚreleaseÚnameÚnode©rÛ   r2   rá   râ   rã   r,   r!   r    Ú
is_in_noderæ   ¢  s\   € ä”�IÓò 	.Ü”B—J‘J 	Ó*ò	.ä”B—J‘J×&Ñ&¨Ó/ò	.ô �J‰J×Ñ×#Ñ# vÑ-ð	r!   c                 óF   — t        t        d«      xr t        t        d«      S )Nrš   r–   )rÛ   r2   r,   r!   r    Úis_worker_availablerè   «  s   € Ü”2�xÓ Ò8¤W¬R°Ó%8Ð8r!   z_StreamingFetcher | NoneÚ_fetcherz�urllib3 only works in Node.js with pyodide.runPythonAsync and requires the flag --experimental-wasm-stack-switching in  versions of node <24.c                óÆ   — t        «       rt        | d«      S t        «       rt        t        | d ¬«      ‚t
        rt        «       rt
        j                  | «      S t        «        y )NT©r   r   r   )	Úhas_jspiÚsend_jspi_requestræ   r   ÚNODE_JSPI_ERRORré   rˆ   r¾   Ú_show_streaming_warning©r   s    r    Úsend_streaming_requestrñ   Á  sQ   € Ü„zÜ  ¨$Ó/Ð/Ü	ŒÜÜ#ØØô
ð 	
õ ”OÔ%Ü�}‰}˜WÓ%Ð%äÔ!Ør!   Fc                 óX   — t         s$da d} t        j                  j                  | «       y y )NTz8Warning: Timeout is not available on main browser thread)Ú_SHOWN_TIMEOUT_WARNINGr2   ÚconsoleÚwarn)r   s    r    Ú_show_timeout_warningrö   Õ  s%   € å!Ø!%ÐØLˆÜ
�
‰
�‰˜Õ ð "r!   c                 óÄ   — t         sZda d} t        «       s| dz  } t        «       r| dz  } t        «       s| dz  } t	        «       du r| dz  } dd	lm} |j                  | «       y y )
NTz%Can't stream HTTP requests because: 
z$  Page is not cross-origin isolated
z+  Python is running in main browser thread
z> Worker or Blob classes are not available in this environment.Fz² Streaming fetch worker isn't ready. If you want to be sure that streaming fetch
is working, you need to call: 'await urllib3.contrib.emscripten.fetch.wait_for_streaming_ready()`r   )rô   )Ú_SHOWN_STREAMING_WARNINGrß   rÜ   rè   rˆ   r2   rô   rõ   )r   rô   s     r    rï   rï   à  ss   € å#Ø#'Ð Ø:ˆÜ'Ô)ØÐ>Ñ>ˆGÜ$Ô&ØÐEÑEˆGÜ"Ô$ØÐWÑWˆGÜÓ Ñ%Øð eñ eˆGåà�‰�WÕð $r!   c                óª  — t        «       rt        | d«      S t        «       rt        t        | d ¬«      ‚	 t
        j                  j                  «       }t        «       s1d|_	        | j                  rEt        | j                  dz  «      |_
        n'|j                  d«       | j                  r
t        «        |j                  | j                  | j                   d«       | j"                  j%                  «       D ].  \  }}|j'                  «       t(        vsŒ|j+                  ||«       Œ0 |j-                  t/        | j0                  «      «       t3        t5        «       j7                  |j9                  «       «      «      }t        «       s)|j:                  j=                  «       j?                  «       }n|j:                  jA                  d«      }tC        |jD                  ||| ¬«      S # tF        $ rh}|jH                  dk(  rtK        |jL                  | ¬	«      ‚|jH                  d
k(  rt        |jL                  | ¬	«      ‚t        |jL                  | ¬	«      ‚d }~ww xY w)NFrë   Úarraybufferr:   ztext/plain; charset=ISO-8859-15zISO-8859-15©rª   r¡   r¢   r   ÚTimeoutErrorrð   ÚNetworkError)'rì   rí   ræ   r   rî   r2   ÚXMLHttpRequestri   rÜ   ÚresponseTyperB   rA   ÚoverrideMimeTyperö   Úopenr£   r¦   r¡   r«   Úlowerr¬   ÚsetRequestHeaderr¾   r   r¢   Údictr   ÚparsestrÚgetAllResponseHeadersr   rp   ÚtobytesÚencoder   r¨   r	   rã   r/   r   )r   Újs_xhrrã   rÔ   r¡   r¢   Úerrs          r    Úsend_requestr  ó  sÇ  € Ü„zÜ  ¨%Ó0Ð0Ü	ŒÜÜ#ØØô
ð 	
ð
%>Ü×"Ñ"×&Ñ&Ó(ˆä(Ô*Ø"/ˆFÔØ�ŠÜ!$ W§_¡_°tÑ%;Ó!<�•à×#Ñ#Ð$EÔFØ�Šô &Ô'à�‰�G—N‘N G§K¡K°Ô7Ø"Ÿ?™?×0Ñ0Ö2‰KˆD�%Ø�z‰z‹|Ô#4Ò4Ø×'Ñ'¨¨eÕ4ð 3ð 	�‰”E˜'Ÿ,™,Ó'Ô(ä”v“x×(Ñ(¨×)EÑ)EÓ)GÓHÓIˆä(Ô*Ø—?‘?×(Ñ(Ó*×2Ñ2Ó4‰Dà—?‘?×)Ñ)¨-Ó8ˆDÜ!ØŸ™¨w¸TÈ7ô
ð 	
øô ò >Ø�8‰8�~Ò%Ü §¡°WÔ=Ð=Ø�X‰X˜Ò'Ü §¡°WÔ=Ð=ô   §¡°WÔ=Ð=ûð>ús    ´CG! ÄCG! Ç!	IÇ*A#IÉIc                ó¬  — | j                   }t        j                  j                  «       }| j                  j                  «       D ��ci c]  \  }}|t        vsŒ||“Œ }}}| j                  }|t        |«      | j                  |j                  dœ}t        «       rd|d<   t        j                  | j                  t        |«      «      }	t        |	||| d¬«      }
i }|
j                  j!                  «       }	 |j#                  «       }t%        |dd«      rn2t'        |j(                  d   «      |t'        |j(                  d	   «      <   ŒP|
j*                  }d
}t-        ||d
| ¬«      }|r6|
j                  �V|
j                  j/                  «       }t1        ||| ||«      }n,t        |
j3                  «       ||| |¬«      j5                  «       }||_        |S c c}}w )a7  
    Send a request using WebAssembly JavaScript Promise Integration
    to wrap the asynchronous JavaScript fetch api (experimental).

    :param request:
        Request to send

    :param streaming:
        Whether to stream the response

    :return: The response object
    :rtype: EmscriptenResponse
    )r¡   r¢   r£   ÚsignalÚmanualÚredirectNr   rÓ   Fr   r   r!   rû   )rB   r2   ÚAbortControllerri   r¡   r«   r¬   r¢   r   r£   r  Ú_is_node_jsÚfetchr¦   r6   rÑ   ÚentriesÚnextÚgetattrÚstrrÔ   r¨   r   Ú	getReaderrÁ   ÚarrayBufferrp   )r   Ú	streamingrB   rÇ   r¶   r·   r¡   Úreq_bodyr¸   Úfetcher_promise_jsÚresponse_jsÚheader_iterÚiter_value_jsrª   r¢   r   Úbody_stream_jss                    r    rí   rí   $  sÔ  € ð  �o‰o€GÜ×,Ñ,×0Ñ0Ó2ÐØ '§¡× 5Ñ 5Ô 7ÔVÑ 7™˜˜1¸1ÔDUÒ;Uˆq�!‰tÐ 7€GÑVØ�|‰|€HàÜ�h“Ø—.‘.Ø%×,Ñ,ñ	€Jô „}Ø!)ˆ
�:ÑäŸ™ '§+¡+¬~¸jÓ/IÓJÐô )ØØØØØô€Kð €GØ×%Ñ%×-Ñ-Ó/€KØ
Ø#×(Ñ(Ó*ˆÜ�= &¨%Ô0Øä36°}×7JÑ7JÈ1Ñ7MÓ3NˆG”C˜×+Ñ+¨AÑ.Ó/Ñ0ð ð ×$Ñ$€KØ!$€Dä!Ø¨°sÀGô€Hñ à×ÑÐ'à(×-Ñ-×7Ñ7Ó9ˆNÜ"Ø ¨°(Ð<Oó‰Dô &Ø×#Ñ#Ó%ØØØØô
÷ ‰%‹'ð 	ð €H„MØ€Oùós Ws   ÁGÁGc                óš  — d}|dkD  r;t        j                  |j                  j                  |«      t	        |dz  «      «      }	 ddlm}  || «      |�t        j                  |«       S S # t        $ r:}|j                  dk(  rt        d||¬«      ‚t        |j                  ||¬«      ‚d}~ww xY w# |�t        j                  |«       w w xY w)ak  
    Await a JavaScript promise synchronously with a timeout which is implemented
    via the AbortController

    :param promise:
        Javascript promise to await

    :param timeout:
        Timeout in seconds

    :param js_abort_controller:
        A JavaScript AbortController object, used on timeout

    :param request:
        The request being handled

    :param response:
        The response being handled (if it exists yet)

    :raises _TimeoutError: If the request times out
    :raises _RequestError: If the request raises a JavaScript exception

    :return: The result of awaiting the promise.
    Nr   r:   )Úrun_syncÚ
AbortErrorzRequest timed outrë   )r2   Ú
setTimeoutÚabortÚbindrA   Úpyodide.ffir!  ÚclearTimeoutr	   rã   r/   r   r   )ÚpromiserB   rÇ   r   r   Útimer_idr!  r
  s           r    rÑ   rÑ   r  sÌ   € ð> €HØ�‚{Ü—=‘=Ø×%Ñ%×*Ñ*Ð+>Ó?ÄÀWÈtÁ^ÓATó
ˆð&Ý(ñ ˜Ó ð ÐÜ�O‰O˜HÕ%ð  øô ò YØ�8‰8�|Ò#ÜØ+°WÀxôð ô  ¨¯©¸WÈxÔXÐXûðYûð ÐÜ�O‰O˜HÕ%ð  ús$   ÁA* Á*	B-Á35B(Â(B-Â-B0 Â0C
c                 óR   — 	 ddl m} m} t         | «       «      S # t        $ r Y yw xY w)a  
    Return true if jspi can be used.

    This requires both browser support and also WebAssembly
    to be in the correct state - i.e. that the javascript
    call into python was async not sync.

    :return: True if jspi can be used.
    :rtype: bool
    r   ©Úcan_run_syncr!  F)r&  r,  r!  r}   ÚImportErrorr+  s     r    rì   rì   ¨  s)   € ðß6ä‘L“NÓ#Ð#øÜò Ùðús   ‚ š	&¥&c                 ó¬   — t        t        d«      xrC t        t        j                  d«      xr' t        j                  j                  j                  dk(  S )z_
    Check if we are in Node.js.

    :return: True if we are in Node.js.
    :rtype: bool
    rá   râ   rä   rå   r,   r!   r    r  r  »  sE   € ô 	”�IÓò 	.Ü”B—J‘J 	Ó*ò	.ô �J‰J×Ñ×#Ñ# vÑ-ð	r!   c                 ó0   — t         rt         j                  S y r   )ré   rˆ   r,   r!   r    rˆ   rˆ   Ê  s   € ÝÜ×'Ñ'Ð'àr!   c               ƒ  óN   K  — t         rt         j                  ƒ d {  –—†  yy7 Œ­w)NTF)ré   rœ   r,   r!   r    Úwait_for_streaming_readyr1  Ñ  s#   è ø€ ÝÜ×.Ñ.×.Ð.Øàð 	/ús   ‚%œ#�%)r5   zdict[str, Any]rz   r
   r|   )r   r   rz   r#   ry   r¿   )r   r   r  r}   rz   r   )r(  r   rB   rx   rÇ   r   r   r"   r   r#   rz   r   )rz   zbool | None)9rØ   Ú
__future__r   Úior´   Úemail.parserr   Úimportlib.resourcesr   Útypingr   r   r2   r&  r   r	   r
   r   Útyping_extensionsr   r   r   r   r   r¬   r³   ÚSUCCESS_EOFre   rg   Ú	Exceptionr   r*   r/   r6   Ú	RawIOBaser8   r�   rÁ   rÜ   rß   ræ   rè   ré   Ú__annotations__rî   rñ   ró   rö   rø   rï   r  rí   rÑ   rì   r  rˆ   r1  r,   r!   r    Ú<module>r<     s¢  ðò"õH #ã 	Û Ý Ý %ß %ã 	÷ó ñ Ý(å &Ý (ðð $Ð à€Ø€Ø€Ø€ô'�Iô 'ô	�mô 	ô	�Mô 	óAôd�"—,‘,ô d÷Ncñ côLh�b—l‘lô hóXRóIóó9ð &*€Ð
"Ó )áÔÙÔÑ(AÔ(CÙŒ\á Ó"�Hà€Hðð óð" Ð ó!ð !Ð óó&.>ðbKØðKØ+/ðKàóKð\3&Øð3&àð3&ð ð3&ð &ð	3&ð
 (ð3&ð 	ó3&óló&óôr!   