K i[UdZddlmZddlZddlZddlmZddlmZddl m Z m Z ddl Z ddl mZmZmZmZe rddlmZd d lmZd d lmZ d Zd ZdZdZdZeej=dj?dZ Gdde!Z"Gdde"Z#Gdde"Z$d3dZ%GddejLZ'GddZ(Gdd ejLZ)d4d!Z*d4d"Z+d4d#Z,d4d$Z-dZ.d%e/d&<e-re+re*se,se(Z.ndZ.d'Z0d5d(Z1d)a2d6d*Z3d)a4d6d+Z5d7d,Z6 d8d-Z7 d9d.Z8d4d/Z9d4d0Z:d:d1Z;d4d2Z*t  18 r"c$|jyrclosers r!__del__z_ReadStream.__del__|  r"c|jSrrErIs r! is_closedz_ReadStream.is_closed r"c"|jSrrNrIs r!closedz_ReadStream.closed~~r"c|jryd|_d|_d|_d|_d|_d|_|jr7|jjtd|jid|_t|5y)NrTrHF)rNr?r>r<r=rErrDrA postMessager7r@rrHrr s r!rHz_ReadStream.closest >>     << KK # #NGT=O=O3P$Q R DL  r"cyNTr-rIs r!readablez_ReadStream.readabler"cyNFr-rIs r!writablez_ReadStream.writabler"cyr\r-rIs r!seekablez_ReadStream.seekabler^r"cb|jstd|jd|jdk(rYtj j |jdt|jjtd|jitj j|jdt|jdk(rt|jd}|dkDr||_d|_n|t k(rs|jd}tj"j%}|j'|j(j+d|}td||jdd|_|j/yt1|jt3t5|}|j(j7|j|j|zj9}|t5|d||xj|zc_|xj|z c_|S) Nz,No buffer for stream in _ReadStream.readintorrgetMorez timed-outr Exception thrown in fetch: F)r<r+rr?r3Atomicsstore ERROR_TIMEOUTrArUr7r@waitrCr0r>ERROR_EXCEPTION TextDecodernewdecoder=slicerDrHminlen memoryviewsubarrayto_py)rbyte_objdata_len string_len js_decoderjson_str ret_lengthrps r!readintoz_ReadStream.readintos!>   ==A  JJ  T__a ? KK # #NIt?Q?Q3R$S T M4<<P$#q)H!| ( ! _,!__Q/ ^^//1 %,,T-=-=-C-CAz-RS%1(< LL! %  Jx,@(AB ##,, MM4==:5 %' .6 8Qz* #  # r") r<rr=rrCfloatrAr r@rBrrreturnNoner{boolrrr r{rB)r%r&r'rrJrNpropertyrRrHrYr]r`rxr(r)s@r!r9r9gsy999 9  9  9#9(   ,r"r9ceZdZddZddZy)_StreamingFetchercd_tjjt t gdt ddi}dfd }tjj|}tjjj|_ tjjj|_ y)NF)create_pyproxiestypezapplication/javascriptchdfd }dfd }|j_|j_y)Nc$d_|yrX)streaming_ready)e js_resolve_fnrs r!onMsgzC_StreamingFetcher.__init__..promise_resolver..onMsgs'+$a r"c|yrr-)r js_reject_fns r!onErrzC_StreamingFetcher.__init__..promise_resolver..onErrs Qr")rr r{r|) js_worker onmessageonerror)rrrrrs`` r!promise_resolverz4_StreamingFetcher.__init__..promise_resolvers' ! (-DNN $%*DNN "r")rr rr r{r|)rr3Blobrjr _STREAMING_WORKER_CODEr7URLcreateObjectURL globalThisWorkerrPromisejs_worker_ready_promise)r js_data_blobr js_data_urls` r!rz_StreamingFetcher.__init__s$ww{{ )*U C F$<= > +ff,,\: --11+>')}}'<'<'@'@AQ'R$r"c |jjDcic]\}}|tvs||}}}|j}|t ||j d}|j dkDrtd|j znd}tjjd}tjj|} tjj|d} tjj| dttjj!| dtj"j|j$tj&j(} |j*j-t/|| |dtjj1| 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||dtGd| d|dcc}}w)N)headersbodymethodrr;i)bufferurl fetchParamsz'Timeout connecting to streaming requestrr statusr connectionID)r status_coderrrcz%Unknown status from worker in fetch: )$ritemsHEADERS_TO_IGNORErr rrCrBr3SharedArrayBufferrj Int32Array Uint8ArrayrdrerfnotifyrrlocationhrefrrUr7rgr0SUCCESS_HEADERrirkrljsonloadsrr9rhr+)rrkvrr fetch_datarCjs_shared_buffer js_int_bufferjs_byte_bufferjs_absolute_urlrtrurv response_objs r!sendz_StreamingFetcher.sends$__224 QAR8RAqD  ||!(%+X 1811D#dW__,-$//33G< ))*:; **+;Q? =9 -+&&**W[["++>CC "" .*#-    q-A  } ,9  1  /'q)J++-J"(()=)=a)LMH::h/L%(2$Y/ !"OONN 0   1  0&q)J++-J!(()=)=a)LMH!-hZ8'TX "7 a8H7IJ C s K&K&Nrzrrr{r)r%r&r'rrr-r"r!rrsS0Fr"rceZdZdZ d dZd dZddZeddZd fd Z ddZ ddZ dd Z dd Z dd ZxZS)_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_streamrCrE_is_donerrcurrent_buffercurrent_buffer_posjs_abort_controller)rrrCrrrs r!rz_JSPIReadStream.__init__FsG-  18 3; ""##6 r"c$|jyrrGrIs r!rJz_JSPIReadStream.__del__XrKr"c|jSrrMrIs r!rNz_JSPIReadStream.is_closed\rOr"c"|jSrrQrIs r!rRz_JSPIReadStream.closed`rSr"c|jryd|_d|_|jj d|_d|_d|_d|_d|_t|)y)NrT) rNr?r>rcancelrErrrrrHrVs r!rHz_JSPIReadStream.closeds] >>     ""$"     r"cyrXr-rIs r!rYz_JSPIReadStream.readableqrZr"cyr\r-rIs r!r]z_JSPIReadStream.writabletr^r"cyr\r-rIs r!r`z_JSPIReadStream.seekablewr^r"ct|jj|j|j|j |j }|jrd|_y|jj|_ d|_ y)NrTFr) _run_sync_with_timeoutrreadrCrrrdonervaluerqrr)r result_jss r!_get_next_bufferz _JSPIReadStream._get_next_bufferzso*    $ $ & LL  $ $LL]]   >> DM"+//"7"7"9D &'D #r"c|j-|jr |j|jytt |t |j|j z }|j|j |j |z|d||xj |z c_|j t |jk(rd|_|S)Nr)rrrHrmrnr)rrrrws r!rxz_JSPIReadStream.readintos    &((*d.A.A.I  M3t223d6M6MM "&!4!4  # #d&=&= &J" : :-  " "c$*=*=&> >"&D r") rrrCryrrrrrrrzr}r)r%r&r'__doc__rrJrNrrRrHrYr]r`rrxr(r)s@r!rr0sy*777# 7 % 7 ! 7$    r"rcttdxr3ttdxr!tjtjk(S)Nwindowr)hasattrr3rrr-r"r!is_in_browser_main_threadrs- 2x QWR%8 QRWW =QQr"cFttdxrtjS)NcrossOriginIsolated)rr3rr-r"r!is_cross_origin_isolatedrs 2, - H"2H2HHr"cttdxrittjdxrMttjjdxr'tjjjdk(S)Nprocessreleasenamenoderr3rrrr-r"r! is_in_noders\I . BJJ * . BJJ&& / . JJ   # #v - r"cFttdxrttdS)Nrr)rr3r-r"r!is_worker_availablers 2x 8WR%88r"z_StreamingFetcher | None_fetcherzurllib3 only works in Node.js with pyodide.runPythonAsync and requires the flag --experimental-wasm-stack-switching in versions of node <24.ctr t|dStrtt|dt rt rt j|Sty)NTrrr) has_jspisend_jspi_requestrrNODE_JSPI_ERRORrrr_show_streaming_warningrs r!send_streaming_requestrsQz $// #  O%}}W%%!r"FcXts$dad}tjj|yy)NTz8Warning: Timeout is not available on main browser thread)_SHOWN_TIMEOUT_WARNINGr3consolewarn)rs r!_show_timeout_warningrs% !!%L   "r"ctsZdad}ts|dz }tr|dz }ts|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_WARNINGrrrrr3rr)rrs r!rrss ##' :') > >G $ & E EG"$ W WG   % e eG W $r"ctr t|dStrtt|d t j j}ts1d|_ |jrEt|jdz|_ n'|jd|jr t|j|j|j d|j"j%D].\}}|j't(vs|j+||0|j-t/|j0t3t5j7|j9}ts)|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-15rrrr TimeoutErrorr NetworkError)'rrrrrr3XMLHttpRequestrjr responseTyperCrBoverrideMimeTyperopenrrrrlowerrsetRequestHeaderrr rdictrparsestrgetAllResponseHeadersrrqtobytesencoderrr rr0r)rjs_xhrrrrrerrs r! send_requestrsz %00 #  %>""&&((*"/F !$W__t%;!<  # #$E F&' GNNGKK7"??002 5KD%zz|#44''e4 5  E',,'(vx(()E)E)GHI(*??((*224D??))-8D! wT7   > 88~ % W= = XX ' W= =  W= =>s CG!CG!! I*A#I  Ic|j}tjj}|jj Dcic]\}}|t vs||}}}|j}|t||j|jd}trd|d<tj|jt|} t| |||d} i}| jj!} | j#} t%| ddrn2t'| j(d|t'| j(d <P| j*} d }t-| |d | }|r6| jV| 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 )rrrsignalmanualredirectNrrFr rr"r)rCr3AbortControllerrjrrrrr rr  _is_node_jsfetchrr7rentriesnextgetattrstrrrr getReaderr arrayBufferrq)r streamingrCrrrrreq_bodyrfetcher_promise_js response_js header_iter iter_value_jsrrrbody_stream_jss r!rr&s ooG,,002 ' 5 5 7V11DU;Uq!tVGV||Hh..%,, J}!) :'++~j/IJ) KG%%--/K #((* =&% 0 36}7J7J17M3NGC ++A./ 0  $$K!$D!sGH    '(--779N"(H{==  % % * *+> ?Wt^AT &(    OOH %  Y 88| #+Wx   WxX X Y   OOH % s$ A** B-35B((B--B00C cR 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_syncrF)r#r)rr~ ImportErrorr(s r!rrs)6LN## s  &&cttdxrCttjdxr'tjjjdk(S)z_ Check if we are in Node.js. :return: True if we are in Node.js. :rtype: bool rrrrr-r"r!rrsE I . BJJ * . JJ   # #v - r"c0trtjSyr)rrr-r"r!rrs'''r"cNKtrtjd{yy7w)NTF)rrr-r"r!wait_for_streaming_readyr.s#.... /s %#%)r6zdict[str, Any]r{r r})rrr{r$rzr)rrrr~r{r) r%rrCryrrrr#rr$r{r)r{z bool | None)=r __future__rior email.parserrimportlib.resourcesrtypingrrr3r#rr r r typing_extensionsr rrrrrr SUCCESS_EOFrfrh __package__joinpath read_textr Exceptionrr+r0r7 RawIOBaser9rrrrrrr__annotations__rrrrrrrrrrrrr.r-r"r!r<s"H# %% (&($   + X*+YY  'I ' m  M Ad",,dN__DhbllhXRI9&* ")(A(C \ "HH"!!&.>bK K+/KK\3& 3& 3&3&& 3& ( 3&  3&l& r"