
    _j(                         S r SSKrSSKrSSKrSSKrSSKJrJrJrJ	r	J
r
  SSKrSSKJrJrJr  SSKJrJrJr  SSKJr  \	S   r " S	 S
5      rg)z
Async WebSocket watcher with async iterator interface for v2 jobs.

Usage:
    async for snapshot in AsyncWatcher(client, job_id, kind="crawl"):
        print(snapshot.status)
    N)AsyncIteratorDictListLiteralOptional)ConnectionClosedConnectionClosedOKConnectionClosedError   )BatchScrapeJobCrawlJobDocument)normalize_document_input)crawlbatchc                       \ rS rSrSSSS.S\S\S\S	\S
\\   SS4S jjr	S\
\   4S jrS\4S jrS\
\   4S jrS rS\4S jrS rSS.S\S\S\\\      4S jjrSrg)AsyncWatcher   r      N)kindpoll_intervaltimeoutclientjob_idr   r   r   returnc                6   Xl         X l        X0l        XPl        [	        S[        U5      5      U l        [        USS 5      nUb%  [        USS 5      U l        [        USS 5      U l	        O$[        USS 5      U l        [        USS 5      U l	        SU l
        / U l        g )N        http_clientapi_urlapi_keyscraping)_client_job_id_kind_timeoutmaxfloat_poll_intervalgetattr_api_url_api_key_status_data)selfr   r   r   r   r   r   s          O/home/rurouni/.local/lib/python3.13/site-packages/firecrawl/v2/watcher_async.py__init__AsyncWatcher.__init__   s     
%(eM.B%CfmT:"#KDADM#KDADM $FIt<DM#FIt<DM&!#
    c                 "    U R                  5       $ N)_iterater.   s    r/   	__aiter__AsyncWatcher.__aiter__4   s    }}r2   c                     U R                   (       d  [        S5      eU R                   R                  SS5      R                  SSS5      nU R                  S:X  a  U SU R                   3$ U S	U R                   3$ )
Nz)API URL is required for WebSocket watcherzhttps://zwss://zhttp://zws://r   r   z
/v2/crawl/z/v2/batch/scrape/)r*   
ValueErrorreplacer$   r#   )r.   ws_bases     r/   _build_ws_urlAsyncWatcher._build_ws_url7   ss    }}HII--''
H=EEiQXZ[\:: Yj77+DLL>::r2   c                  #    U R                  5       n/ nU R                  (       a   UR                  SSU R                   345         [        R                  " US US9 IS h  vN nU R
                  (       a0  [        R                  " 5       R                  5       U R
                  -   OS n U R                  5       I S h  vN nU7v   UR                  S;   a   S S S 5      IS h  vN   g    UbO  [        SU[        R                  " 5       R                  5       -
  5      nUS:  a  [        U R                  U5      OSnOU R                  n[        R                  " UR!                  5       US9I S h  vN n [.        R0                  " U5      n
U
R3                  S
5      nUS:X  aN  SU l        U R6                  S:X  a  [9        SSSSS S / S97v   O[;        SSSSS S / S97v    S S S 5      IS h  vN   g US:X  ak  U
R3                  S0 5      nUR3                  SU R4                  5      U l        UR3                  S/ 5      =(       d    / nU R<                  R?                  U5        GOUS:X  aB  U
R3                  S5      n[A        U[B        5      (       a  U R<                  R                  U5        OUS:X  a  SU l        U
R3                  S0 5      =(       d    0 nUR3                  S/ 5      =(       d    / n[A        U[D        5      (       aB  U(       a;  U H5  n[A        U[B        5      (       d  M  U R<                  R                  U5        M7     U RG                  SXR<                  S97v    S S S 5      IS h  vN   g U
R3                  SU
5      nUR3                  SU
R3                  SU R4                  5      5      nU RG                  UUS9nU7v   US;   a   S S S 5      IS h  vN   g GM   GN GN' GN! [         a     GNf = f GN! [        R"                   a    U R%                  5       I S h  vN  n	U	b(  U	7v   U	R                  S;   a   S S S 5      IS h  vN    g Ub:  [        R                  " 5       R                  5       U:  a   S S S 5      IS h  vN    g  GM  [&        [(        [*        4 a    [        R                  " 5       U R
                  =(       d    S-   n  U R                  5       I S h  vN  n	U	7v   U	R                  S;   a   S S S 5      IS h  vN    g O"! [         a      S S S 5      IS h  vN    g f = f[        R                  " 5       U:  a   S S S 5      IS h  vN    g [        R,                  " S	5      I S h  vN    M  f = f! [         a     GM  f = f GN GN5 GN! , IS h  vN  (       d  f       g = f! [         a    [        R                  " 5       U R
                  =(       d    S-   n  U R                  5       I S h  vN  n	U	7v   U	R                  S;   a   g O! [         a      g f = f[        R                  " 5       U:  a   g [        R,                  " S	5      I S h  vN    M  f = f7f)NAuthorizationzBearer )max_sizeadditional_headers)	completedfailed	cancelledr   r   )r      r   typeerrorrD   r   statusrC   totalcredits_used
expires_atnextdatacatchuprO   rJ   documentdonerC   )rJ   payloaddocs_override)rJ   rS   )$r=   r+   append
websocketsconnectr%   asyncioget_event_looptime_fetch_job_statusrJ   	Exceptionr&   minr(   wait_forrecvTimeoutError_safe_fetchr	   r   r
   sleepjsonloadsgetr,   r$   r   r   r-   extend
isinstancedictlist_make_snapshot)r.   uriheaders_list	websocketdeadlinepre	remainingr   msgjobbodymsg_typeddocs_indocraw_payloadrS   
status_strsnapshots                      r/   r5   AsyncWatcher._iterate?   s      "==GDMM?2K LMe	'!))#Q]^^bkNRmm711388:T]]Jae $ 6 6 88CIzz%II _^^ J
 3#/(+CG<R<R<T<Y<Y<[1[(\IMVYZ]c$*=*=y&I`cG&*&9&9G$+$4$4Y^^5Ew$WW2!#zz#  $xx/H7*'/::0"*(aq_`mqx|  DF  #G  G"0AUVefsw  C  JL  #M  Mq _^^r "Y. HHVR0'(uuXt||'D"#%%"3"9r

))'2!Z/"hhv.%c400 JJ--c2!V+'2&*hhvr&:&@b"-//&""="C%gt44'.#-c4#8#8$(JJ$5$5c$: (/ #11kisis1tt] _^^b #hhvt4G!(Xtxx$,,7W!XJ#22*g2VH"N!%IIm _^^  _ 9	 _ !  X"// 	!$($4$4$666?"%I"zz-QQ &3 _^^4 $/G4J4J4L4Q4Q4SW_4_"7 _^^8 !.0@BWX 3#'99;$--2E2#F"',0,B,B,D&D&D&)	#&::1U#U$*K _^^H $V#, ' &O _^^L'#yy{h6 &S _^^T #*--"222 #3  % ! ![ _^^^n  	'yy{dmm&9r:H $ 6 6 888CIzz%II J  99;(*mmA&&& 	's  AY;W !O!"W %AV(*O*=O$>O*W #O'$W (Y;)V(,BO>0O;1O>6VAV( W +V,W 0Y;1D0V(%=V("W -V".W 2Y;3AV(W V%W Y;V(!W $O*'W *
O84V(7O88V(;O>>'V
%P(&V
V(W QW Y;*V
 V(W RW Y;V(A V
T+S.,TV(W TW Y;V

T9$V
%V(&W 1T42W 7Y;8T99V
V(W !U$"W 'Y;(V
VV

V(
VV(VV(W "W %W (V?.V1/V?;W >Y;?W 6Y89X*XX*'Y;)Y8*
X84Y85Y;7X88Y8Y;Y8/Y20Y88Y;c                    #    U R                   S:X  a  U R                  S5      I S h  vN $ U R                  S5      I S h  vN $  N N7f)Nr   get_crawl_statusget_batch_scrape_status)r$   _call_status_methodr6   s    r/   r[   AsyncWatcher._fetch_job_status   sD     :: 112DEEE--.GHHH FHs!   %A	AA	 AA	A	method_namec                   #    [        U R                  US 5      nUbe   U" U R                  5      nUb'  [        R
                  " U5      (       a
  UI S h  vN $ U$ [        R                  " X R                  5      I S h  vN $ [        U R                  SS 5      nUbt  [        XAS 5      nUbe   U" U R                  5      nUb'  [        R
                  " U5      (       a
  UI S h  vN $ U$ [        R                  " X R                  5      I S h  vN $ [        SU 35      e! [         a    S n Nf = f N N! [         a    S n Nf = f Nd N<7f)Nv2zClient does not expose )	r)   r"   r#   	TypeErrorinspectisawaitablerX   	to_threadRuntimeError)r.   r   methresultr   s        r/   r    AsyncWatcher._call_status_method   s;    t||[$7dll+ !&&v..!'<' **4>>> T\\4.>2D1D"!$,,/F %**622%+|+!M$..t\\BBB4[MBCC1   ( ? ! "!F"  ,Bs   E
D #E
D0)E
=D2>-E
,D4 >#E
!E")E
EE
D-*E
,D--E
2E
4E E
EE
E
c                 `   #     U R                  5       I S h  vN $  N! [         a     g f = f7fr4   )r[   r\   r6   s    r/   ra   AsyncWatcher._safe_fetch   s0     	//1111 		s(   .  . 
+.+.)rT   rJ   rS   rT   c          
      b   / nUb  UOUR                  S/ 5      =(       d    / nU H?  n[        U[        5      (       d  M  [        U5      nUR	                  [        S
0 UD65        MA     U R                  S:X  a]  [        UUR                  SS5      UR                  SS5      UR                  SS5      UR                  S5      UR                  S5      US	9$ [        UUR                  SS5      UR                  SS5      UR                  S5      UR                  S5      UR                  S5      US	9$ )NrO   r   rC   r   rK   creditsUsed	expiresAtrN   rI    )	re   rg   rh   r   rU   r   r$   r   r   )r.   rJ   rS   rT   docssource_docsrw   ru   s           r/   rj   AsyncWatcher._make_snapshot   s   '4'@mgkkRXZ\F]FcacC#t$$,S1HMqM* 
 :: !++k15kk'1-$[[:";;{3[[(  kk+q1++gq) ]3{{;/V$
 	
r2   )	r+   r*   r"   r-   r#   r$   r(   r,   r%   )__name__
__module____qualname____firstlineno__objectstrJobKindintr   r0   r   r7   r=   r5   r[   r   ra   r   r   rj   __static_attributes__r   r2   r/   r   r      s      !%$$ $
 $ $ #$ 
$6=0 ;s ;l'f 5 l'\I
DS D@ cg 
 
d 
8TXY]T^K_ 
 
r2   r   )__doc__rX   r   rc   rZ   typingr   r   r   r   r   rV   websockets.exceptionsr   r	   r
   typesr   r   r   utils.normalizer   r   r   r   r2   r/   <module>r      sG        ? ?  ] ] 5 5 5
"
#Z
 Z
r2   