hyb
2026-01-30 15bc7727b58bf9ca0c8f21702fa893daac232b8d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
Ë
ê^ià[ãóX—UdZddlmZddlZddlZddlmZddlmZddl    m
Z
m Z ddl Z ddl mZmZmZmZe
rddlmZd    d
lmZd    d lmZ    d Zd ZdZdZdZGd„de«ZGd„de«ZGd„de«Z d0d„Z!Gd„dejD«Z#Gd„d«Z$Gd„dejD«Z%d1d„Z&d1d„Z'd1d „Z(d1d!„Z)dZ*d"e+d#<e)«re'«re&«se(«se$«Z*ndZ*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‡—eZdZ    ddddœ                    dˆfd„ZˆxZS)Ú _RequestErrorN©ÚrequestÚresponsecób•—||_||_||_t‰||j«y©N)rrÚmessageÚsuperÚ__init__)ÚselfrrrÚ    __class__s    €õsH:\项目\archive\测试组\脚本\Change_password\venv_build\Lib\site-packages\urllib3/contrib/emscripten/fetch.pyrz_RequestError.__init__Hs+ø€ðˆŒ Ø ˆŒ ؈Œ Ü ‰Ñ˜Ÿ™Õ&ór)rz
str | NonerúEmscriptenRequest | NonerúEmscriptenResponse | None)Ú__name__Ú
__module__Ú __qualname__rÚ __classcell__©rs@r rrGs;ø„ð#ð
'ð-1Ø.2ñ
'àð
'ð*ð    
'ð
,÷
'ñ
'r!rcó —eZdZy)Ú_StreamingErrorN©r$r%r&©r!r r*r*Uó„Ør!r*có —eZdZy)Ú _TimeoutErrorNr+r,r!r r/r/Yr-r!r/cóL—t|tjj¬«S)N)Údict_converter)r ÚjsÚObjectÚ fromEntries)Údict_vals r Ú_obj_from_dictr6]s€Ü ¬"¯)©)×*?Ñ*?Ô @Ð@r!c󂇗eZdZ                                                d
d„Zd d„Zd d„Zed d„«Zd ˆfd„ Zd d„Z    d d„Z
d d„Z d d    „Z ˆxZ S)Ú _ReadStreamcó¶—||_||_d|_d|_||_||_|dkDrt d|z«nd|_d|_d|_    ||_
y)NréèTF) Ú
int_bufferÚ byte_bufferÚread_posÚread_lenÚ connection_idÚworkerÚintÚtimeoutÚis_liveÚ
_is_closedr)rr;r<rBr@r?rs       r rz_ReadStream.__init__bs]€ð%ˆŒØ&ˆÔ؈Œ ؈Œ Ø*ˆÔ؈Œ Ø.5¸ªk”s˜4 '™>Ô*¸tˆŒ ؈Œ ؈ŒØ18ˆ r!có$—|j«yr©Úclose©rs r Ú__del__z_ReadStream.__del__vó €Ø 
‰
 r!có—|jSr©rDrHs r Ú    is_closedz_ReadStream.is_closedzó €Ø‰Ðr!có"—|j«Sr©rMrHs r Úclosedz_ReadStream.closed~ó€à~‰~ÓÐr!có•—|j«ryd|_d|_d|_d|_d|_d|_|jr7|jjtd|ji««d|_t‰|5«y)NrTrGF)rMr>r=r;r<rDrrCr@Ú postMessager6r?rrG©rrs €r rGz_ReadStream.close‚stø€Ø >‰>Ô Ø ØˆŒ ؈Œ ؈ŒØˆÔ؈ŒØˆŒ Ø <Š<Ø K‰K× #Ñ #¤N°G¸T×=OÑ=OÐ3PÓ$QÔ RØ ˆDŒLÜ ‰‰ r!có—y©NTr,rHs r Úreadablez_ReadStream.readableó€Ør!có—y©NFr,rHs r Úwritablez_ReadStream.writable“ó€Ør!có—yr[r,rHs r Úseekablez_ReadStream.seekable–r]r!cób—|jstd|jd¬«‚|jdk(rYtj
j |jdt«|jjtd|ji««tj
j|jdt|j«dk(rt‚|jd}|dkDr||_d|_n”|t k(rs|jd}tj"j%«}|j'|j(j+d|««}td|›|jd¬«‚d|_|j/«yt1|jt3t5|«««}|j(j7|j|j|z«j9«}|t5|«d||xj|zc_|xj|z c_|S)    Nz,No buffer for stream in _ReadStream.readintorrÚgetMorez    timed-outr úException thrown in fetch: F)r;r*rr>r2ÚAtomicsÚstoreÚ ERROR_TIMEOUTr@rTr6r?ÚwaitrBr/r=ÚERROR_EXCEPTIONÚ TextDecoderÚnewÚdecoder<ÚslicerCrGÚminÚlenÚ
memoryviewÚsubarrayÚto_py)rÚbyte_objÚdata_lenÚ
string_lenÚ
js_decoderÚjson_strÚ
ret_lengthros        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;rr<rrBÚfloatr@r
r?rArr©ÚreturnÚNone©rzÚbool©rqr rzrA)r$r%r&rrIrMÚpropertyrQrGrXr\r_rwr'r(s@r r8r8asyø„ð9àð9ðð9ðð    9ð
ð 9ð ð 9ð#ó9ó(óðò óð õ óóó÷,r!r8có—eZdZdd„Zdd„Zy)Ú_StreamingFetchercóà‡—d‰_tt«jd«j    d¬«}t
j jt|gd¬«tddi««}d    ˆfd„ }t
jj|«}t
jjj|«‰_t
jjj|«‰_y)
NFzemscripten_fetch_worker.jszutf-8)Úencoding)Úcreate_pyproxiesÚtypezapplication/javascriptcóh•‡‡—dˆˆfd„ }dˆfd„ }|‰j_|‰j_y)Ncó$•—d‰_‰|«yrW)Ústreaming_ready)ÚeÚ js_resolve_fnrs €€r ÚonMsgzC_StreamingFetcher.__init__.<locals>.promise_resolver.<locals>.onMsg×sø€Ø'+Ô$Ù˜aÕ r!có•—‰|«yrr,)r‰Ú js_reject_fns €r ÚonErrzC_StreamingFetcher.__init__.<locals>.promise_resolver.<locals>.onErrÛs
ø€Ù˜Q•r!)r‰r
rzr{)Ú    js_workerÚ    onmessageÚonerror)rŠrr‹rŽrs``  €r Úpromise_resolverz4_StreamingFetcher.__init__.<locals>.promise_resolverÖs'ú€ö !õ  ð(-ˆDN‰NÔ $Ø%*ˆDN‰NÕ "r!)rŠr
rr
rzr{)rˆrÚ __package__ÚjoinpathÚ    read_textr2ÚBlobrir r6ÚURLÚcreateObjectURLÚ
globalThisÚWorkerrÚPromiseÚjs_worker_ready_promise)rÚstreaming_worker_codeÚ js_data_blobr’Ú js_data_urls`    r rz_StreamingFetcher.__init__És´ø€à$ˆÔä ”+Ó ß ‰XÐ2Ó 3ß ‰Y ˆYÓ (ð    ô
—w‘w—{‘{Ü Ð(Ð)¸EÔ BÜ ˜FÐ$<Ð=Ó >ó
ˆ õ
        +ô—f‘f×,Ñ,¨\Ó:ˆ ÜŸ™×-Ñ-×1Ñ1°+Ó>ˆŒÜ')§}¡}×'<Ñ'<×'@Ñ'@ÐAQÓ'RˆÕ$r!c óØ—|jj«Dcic]\}}|tvsŒ||“Œ}}}|j}|t    |«|j
dœ}|j dkDrtd|j z«nd}tjjd«}tjj|«}    tjj|d«}
tjj|    dt«tjj!|    d«tj"j|j$tj&«j(} |j*j-t/|| |dœ««tjj1|    dt|«|    dtk(rt3d|d¬«‚|    dt4k(r“|    d    } tj6j«} | j9|
j;d| ««}t=j>|«}tA||d
|d tC|    |
|j |j*|d |«¬ «S|    dtDk(rU|    d    } tj6j«} | j9|
j;d| ««}tGd|›|d¬«‚tGd|    d›|d¬«‚cc}}w)N)ÚheadersÚbodyÚmethodrr:ié)ÚbufferÚurlÚ fetchParamsz'Timeout connecting to streaming requestrr Ústatusr¡Ú connectionID)rÚ status_coder¡r¢rbz%Unknown status from worker in fetch: )$r¡ÚitemsÚHEADERS_TO_IGNOREr¢r r£rBrAr2ÚSharedArrayBufferriÚ
Int32ArrayÚ
Uint8ArrayrcrdreÚnotifyr—r¦ÚlocationÚhrefrrTr6rfr/ÚSUCCESS_HEADERrhrjrkÚjsonÚloadsrr8rgr*)rrÚkÚvr¡r¢Ú
fetch_datarBÚjs_shared_bufferÚ js_int_bufferÚjs_byte_bufferÚjs_absolute_urlrsrtruÚ response_objs                r Úsendz_StreamingFetcher.sendåsš€à$Ÿ_™_×2Ñ2Ó4÷
ِQ˜¸ÔARÒ8RˆAˆq‰Dð
ˆñ
ð|‰|ˆØ!(´%¸³+ÈÏÉÑ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©rrrzr)r$r%r&rr¾r,r!r rrÈs„óSô8Fr!rc󊇗eZdZdZ                                        d d„Zd d„Zdd„Zedd„«Zd ˆfd„ Z    dd„Z
dd„Z dd    „Z dd
„Z dd „ZˆxZS)Ú_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_streamrBrDÚ_is_donerrÚcurrent_bufferÚcurrent_buffer_posÚjs_abort_controller)rrÃrBrrrÇs      r rz_JSPIReadStream.__init__DsG€ð-ˆÔ؈Œ ؈ŒØˆŒ Ø18ˆŒ Ø3;ˆŒ Ø"ˆÔØ"#ˆÔØ#6ˆÕ r!có$—|j«yrrFrHs r rIz_JSPIReadStream.__del__VrJr!có—|jSrrLrHs r rMz_JSPIReadStream.is_closedZrNr!có"—|j«SrrPrHs r rQz_JSPIReadStream.closed^rRr!cóڕ—|j«ryd|_d|_|jj    «d|_d|_d|_d|_d|_t‰|)«y)NrT) rMr>r=rÃÚcancelrDrÄrrrrGrUs €r rGz_JSPIReadStream.closebs]ø€Ø >‰>Ô Ø ØˆŒ ؈Œ Ø ×Ñ×"Ñ"Ô$Ø"ˆÔ؈ŒØˆŒ ؈Œ ؈Œ Ü ‰‰ r!có—yrWr,rHs r rXz_JSPIReadStream.readableorYr!có—yr[r,rHs r r\z_JSPIReadStream.writablerr]r!có—yr[r,rHs r r_z_JSPIReadStream.seekableur]r!có—t|jj«|j|j|j
|j ¬«}|jrd|_y|jj«|_ d|_ y)NrTFr) Ú_run_sync_with_timeoutrÃÚreadrBrÇrrÚdonerÄÚvaluerprÅrÆ)rÚ    result_jss  r Ú_get_next_bufferz _JSPIReadStream._get_next_bufferxso€Ü*Ø × Ñ × $Ñ $Ó &Ø L‰LØ × $Ñ $Ø—L‘LØ—]‘]ô 
ˆ    ð >Š>Ø ˆDŒMØà"+§/¡/×"7Ñ"7Ó"9ˆDÔ Ø&'ˆDÔ #Ør!có°—|j€-|j«r |j€|j«ytt    |«t    |j«|j
z
«}|j|j
|j
|z|d||xj
|z c_|j
t    |j«k(rd|_|S)Nr)rÅrÖrGrlrmrÆ)rrqrvs   r rwz_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ÃrrBrxrrrrrÇrryr|r~)r$r%r&Ú__doc__rrIrMrrQrGrXr\r_rÖrwr'r(s@r rÁrÁ.syø„ñð*7àð7ðð7ð#ð    7ð
%ð 7ð !ó 7ó$óðò óð õ óóóó÷ r!rÁcóŒ—ttd«xr3ttd«xr!tjtjk(S)NÚwindowr)Úhasattrr2rrÚr,r!r Úis_in_browser_main_threadrܚs-€Ü ”2xÓ  Ò Q¤W¬R°Ó%8Ò Q¼R¿W¹WÌÏ    É    Ñ=QÐQr!cóF—ttd«xrtjS)NÚcrossOriginIsolated)rÛr2rÞr,r!r Úis_cross_origin_isolatedrߞs€Ü ”2Ð,Ó -Ò H´"×2HÑ2HÐHr!cóø—ttd«xrittjd«xrMttjjd«xr'tjjjdk(S)NÚprocessÚreleaseÚnameÚnode©rÛr2rárârãr,r!r Ú
is_in_noderæ¢s\€ä”IÓò    .Ü ”B—J‘J     Ó *ò    .ä ”B—J‘J×&Ñ&¨Ó /ò    .ô J‰J× Ñ × #Ñ # vÑ -ð    r!cóF—ttd«xrttd«S)Nršr–)rÛr2r,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«St«rtt|d¬«‚t
rt «rt
j|«St«y)NT©rrr)    Úhas_jspiÚsend_jspi_requestrærÚNODE_JSPI_ERRORrérˆr¾Ú_show_streaming_warning©rs r Úsend_streaming_requestrñÁsQ€Ü„zÜ  ¨$Ó/Ð/Ü    ŒÜÜ#ØØô
ð    
õ ”OÔ%܏}‰}˜WÓ%Ð%äÔ!Ør!FcóX—ts$dad}tjj|«yy)NTz8Warning: Timeout is not available on main browser thread)Ú_SHOWN_TIMEOUT_WARNINGr2ÚconsoleÚwarn)rs r Ú_show_timeout_warningröÕs%€å !Ø!%ÐØLˆÜ

‰
‰˜Õ ð "r!cóėtsZdad}t«s|dz }t«r|dz }t«s|dz }t    «dur|dz }dd    lm}|j|«yy)
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ˆr2rôrõ)rrôs  r rïrïàss€å #Ø#'РØ:ˆÜ'Ô)Ø Ð>Ñ >ˆGÜ $Ô &Ø ÐEÑ EˆGÜ"Ô$Ø ÐWÑ WˆGÜ Ó  Ñ %Ø ðeñ eˆGåà ‰ WÕð $r!cóª—t«r t|d«St«rtt|d¬«‚    t
j j«}t«s1d|_    |jrEt|jdz«|_
n'|jd«|jr
t«|j|j|j d«|j"j%«D].\}}|j'«t(vsŒ|j+||«Œ0|j-t/|j0««t3t5«j7|j9«««}t«s)|j:j=«j?«}n|j:jAd«}tC|jD|||¬«S#tF$rh}|jHdk(rtK|jL|¬    «‚|jHd
k(rt|jL|¬    «‚t|jL|¬    «‚d}~wwxYw) NFrëÚ arraybufferr:ztext/plain; charset=ISO-8859-15z ISO-8859-15©rªr¡r¢rÚ TimeoutErrorrðÚ NetworkError)'rìrírærrîr2ÚXMLHttpRequestrirÜÚ responseTyperBrAÚoverrideMimeTyperöÚopenr£r¦r¡r«Úlowerr¬ÚsetRequestHeaderr¾r r¢ÚdictrÚparsestrÚgetAllResponseHeadersrrpÚtobytesÚencoderr¨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ò    5‰KˆD%؏z‰z‹|Ô#4Ò4Ø×'Ñ'¨¨eÕ4ð    5ð     ‰ ”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 ´CG!ÄCG!Ç!    IÇ*A#I É Icó¬—|j}tjj«}|jj «Dcic]\}}|t vsŒ||“Œ}}}|j}|t|«|j|jdœ}t«rd|d<tj|jt|««}    t|    |||d¬«}
i}|
jj!«}     | j#«} t%| dd«rn2t'| j(d«|t'| j(d    «<ŒP|
j*} d
}t-| |d
|¬ «}|r6|
jV|
jj/«}t1|||||«}n,t|
j3«||||¬«j5«}||_|Scc}}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ÚredirectNrrÓFr rr!rû)rBr2ÚAbortControllerrir¡r«r¬r¢r r£r Ú _is_node_jsÚfetchr¦r6rÑÚentriesÚnextÚgetattrÚstrrÔr¨rÚ    getReaderrÁÚ arrayBufferrp)rÚ    streamingrBrÇ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™˜˜1¸1ÔDUÒ;Uˆq!‰tÐV€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ùósWs ÁGÁGcóš—d}|dkDr;tj|jj|«t    |dz««}    ddlm}||«|tj|«SS#t$r:}|jdk(rtd||¬«‚t|j||¬«‚d}~wwxYw#|tj|«wwxYw)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.
    Nrr:)Úrun_syncÚ
AbortErrorzRequest timed outrë) r2Ú
setTimeoutÚabortÚbindrAÚ pyodide.ffir!Ú clearTimeoutr    rãr/rr)ÚpromiserBrÇrrÚtimer_idr!r
s        r rÑrÑrs̀ð>€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Â0C
cóR—    ddlm}m}t|««S#t$rYywxYw)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ó¬—ttd«xrCttjd«xr'tjjjdk(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 rr»sE€ô    ”IÓò    .Ü ”B—J‘J     Ó *ò    .ô J‰J× Ñ × #Ñ # vÑ -ð    r!có0—trtjSyr)rérˆr,r!r rˆrˆÊs€ÝÜ×'Ñ'Ð'àr!cƒóNK—trtjƒd{–—†yy7Œ­w)NTF)rérœr,r!r Úwait_for_streaming_readyr1Ñs#èø€ÝÜ×.Ñ.×.Ð.Øàð    /ús ‚%œ#%)r5zdict[str, Any]rzr
r|)rrrzr#ryr¿)rrrr}rzr) r(rrBrxrÇrrr"rr#rzr)rzz bool | None)9rØÚ
__future__rÚior´Ú email.parserrÚimportlib.resourcesrÚtypingrrr2r&rr    r
r Útyping_extensionsr rrrrr¬r³Ú SUCCESS_EOFrergÚ    Exceptionrr*r/r6Ú    RawIOBaser8rrÁrÜrßrærèréÚ__annotations__rîrñrórörørïr rírÑrìrrˆr1r,r!r ú<module>r<s¢ðò"õH#ã    Û ÝÝ%ß%ã    ÷óñÝ(å&Ý(ðð$Ðà€Ø€ Ø€ Ø€ô 'Iô 'ô    mô    ô    Mô    óAôd"—,‘,ôd÷NcñcôLhb—l‘lôhóXRóIóó9ð&*€Ð
"Ó)áÔÙÔÑ(AÔ(CÙ Œ\á Ó"Hà€Hððóð"Ðó!ð!Ðóó&.>ðbKØ ðKØ+/ðKàóKð\3&Ø ð3&à ð3&ðð3&ð&ð    3&ð
(ð 3&ð     ó 3&óló& óôr!