
    _j7                         S 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	J
r
Jr  SSKrSSKJrJrJr  SSKJr  \S   r\	\\4   r " S S	5      rg)
z
WebSocket-based watcher for v2 jobs (crawl and batch), mirroring v1 behavior.

Usage:
    watcher = client.watcher(job_id, kind="crawl")
    watcher.add_listener(lambda status: print(status.status))
    watcher.start()
    N)CallableListOptionalLiteralUnionDictAny   )CrawlJobBatchScrapeJobDocument)normalize_document_input)crawlbatchc                      \ rS rSr   SS\S\S\S\S\\   SS4S	 jjr	S
\
\/S4   SS4S jrS\SS4S jrS\S\
\\\4   /S4   SS4S jrS\S\\\4   SS4S jrS\4S jrSS jrS\4S jrSS jrSS jrSS jrSrg)Watcher   Nclientjob_idkindpoll_intervaltimeoutreturnc                 @   Xl         X l        X0l        XPl        X@l        / U l        S U l        [        R                  " 5       U l	        [        USS 5      n[        USS 5      U l        [        USS 5      U l        SU l        / U l        / / / S.U l        SU l        SU l        g )Nhttp_clientapi_urlapi_keyscraping)doneerrordocumentF)_client_job_id_kind_timeout_poll_interval
_listeners_thread	threadingEvent_stopgetattr_api_url_api_keystatusdata_event_handlers
_sent_done_sent_error)selfr   r   r   r   r   r   s          I/home/rurouni/.local/lib/python3.13/site-packages/firecrawl/v2/watcher.py__init__Watcher.__init__   s     
+;=37__&
fmT:'.{It'L'.{It'L &*,	S

 !&!&    callbackc                 :    U R                   R                  U5        g N)r'   append)r4   r9   s     r5   add_listenerWatcher.add_listener:   s    x(r8   r/   c                 p    [        U R                  5       H  n U" U5        M     g ! [         a     M  f = fr;   )listr'   	Exception)r4   r/   cbs      r5   _emitWatcher._emit=   s5    t'B6
 (  s   '
55
event_typehandlerc                 `    XR                   ;   a  U R                   U   R                  U5        g g r;   )r1   r<   )r4   rE   rF   s      r5   add_event_listenerWatcher.add_event_listenerE   s,    ---  ,33G< .r8   detailc                     XR                   ;   a   U R                   U    H  n U" U5        M     g g ! [         a     M  f = fr;   )r1   rA   )r4   rE   rJ   rF   s       r5   dispatch_eventWatcher.dispatch_eventI   sH    ---//
;FO < . ! s   1
??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#   )r4   ws_bases     r5   _build_ws_urlWatcher._build_ws_urlQ   ss    }}HII--''
H=EEiQXZ[\:: Yj77+DLL>::r8   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                  R                  5       (       Gd  UbP  [        SU[        R                  " 5       R                  5       -
  5      n[        U R                  =(       d    UU5      nOU R                  =(       d    Sn [        R                  " UR                  5       US9I S h  vN n [4        R6                  " U5      nUR9                  S5      n	U	S:X  a  SU l        U R-                  SU R(                  U R.                  UR9                  S5      U R0                  S.5        S
U l        U R<                  S:X  a  [?        SSSSS S / S9n
O[A        SSSSS S / S9n
U RC                  U
5        GOXU	S:X  a  UR9                  S0 5      nUR9                  SU R(                  5      U l        UR9                  S/ 5      nU R.                  RE                  U5        U H!  nU R-                  SXR0                  S.5        M#     GOlU	S:X  aa  UR9                  S5      n[G        U[H        5      (       a9  U R.                  R                  U5        U R-                  SXR0                  S.5        GOU	S:X  Ga  SU l        UR9                  S0 5      =(       d    0 nUR9                  S/ 5      =(       d    / n[G        U[J        5      (       aB  U(       a;  U H5  n[G        U[H        5      (       d  M  U R.                  R                  U5        M7     U R-                  SU R(                  U R.                  U R0                  S	.5        S
U l        / nU R.                   H?  n[G        U[H        5      (       d  M  [M        U5      nUR                  [O        S0 UD65        MA     U R<                  S:X  a^  [?        SUR9                  SS5      UR9                  SS5      UR9                  SS5      UR9                  S5      UR9                  S5      US9n
O][A        SUR9                  SS5      UR9                  SS5      UR9                  SS5      UR9                  S5      UR9                  S5      US9n
U RC                  U
5        GO]UR9                  SU5      n[G        U[H        5      =(       a    SU;   =(       d    SU;   nU(       d  GM  UR9                  SUR9                  SU R(                  5      5      nU R<                  S:X  Ga_  / nUR9                  S/ 5       H?  n[G        U[H        5      (       d  M  [M        U5      nUR                  [O        S0 UD65        MA     [?        UUR9                  SS5      UR9                  SS5      UR9                  SS5      UR9                  S5      UR9                  S5      US9n
U RC                  U
5        US;   a  US:X  aB  U R*                  (       d1  U R-                  SUU R.                  U R0                  S	.5        S
U l        US:X  aB  U R:                  (       d1  U R-                  SUU R.                  U R0                  S	.5        S
U l        GOGO[/ nUR9                  S/ 5       H?  n[G        U[H        5      (       d  M  [M        U5      nUR                  [O        S0 UD65        MA     [A        UUR9                  SS5      UR9                  SS5      UR9                  S5      UR9                  S5      UR9                  S5      US9n
U RC                  U
5        US;   a  US:X  aB  U R*                  (       d1  U R-                  SUU R.                  U R0                  S	.5        S
U l        US:X  aB  U R:                  (       d1  U R-                  SUU R.                  U R0                  S	.5        S
U l        O"U R                  R                  5       (       d  GM  S S S 5      IS h  vN   U R(                  S:X  aN  U R*                  (       d<  U R-                  SU R(                  U R.                  U R0                  S	.5        S
U l        g g g  GN GN! [        R                    a&    U R#                  5       I S h  vN  (       a   M   GM|  [        R$                   a     M  [&         Ga    U R                  R                  5       (       Gd~  U R#                  5       I S h  vN  (       aq   S S S 5      IS h  vN    U R(                  S:X  aN  U R*                  (       d<  U R-                  SU R(                  U R.                  U R0                  S	.5        S
U l        g g g Ub  [        R                  " 5       R                  5       U:  aq   S S S 5      IS h  vN    U R(                  S:X  aN  U R*                  (       d<  U R-                  SU R(                  U R.                  U R0                  S	.5        S
U l        g g g [        R2                  " U R                  =(       d    S5      I S h  vN    U R                  R                  5       (       d  GM~   S S S 5      IS h  vN    U R(                  S:X  aN  U R*                  (       d<  U R-                  SU R(                  U R.                  U R0                  S	.5        S
U l        g g g f = f! [&         a     G
M  f = f GN! , IS h  vN  (       d  f       GN= f! [&         a     GNf = f! U R(                  S:X  aN  U R*                  (       d<  U R-                  SU R(                  U R.                  U R0                  S	.5        S
U l        f f f = f7f)NAuthorizationzBearer )max_sizeadditional_headersg           r   	completedr   r/   r0   idT   typer    failed)r/   r0   r    r\   r   r   )r/   rZ   totalcredits_used
expires_atnextr0   catchupr0   r/   r!   )r0   r\   r`   creditsUsed	expiresAtrc   rZ   r_   	cancelled )(rR   r.   r<   
websocketsconnectr%   asyncioget_event_looptimer+   is_setmaxminr&   wait_forrecvTimeoutError_poll_status_onceCancelledErrorrA   r/   r2   rL   r0   r#   sleepjsonloadsgetr3   r$   r   r   rC   extend
isinstancedictr@   r   r   )r4   uriheaders_list	websocketdeadline	remainingr   msgbodymsg_typejobddocs_indocraw_payloaddocspayloadhas_status_field
status_strs                      r5   _run_wsWatcher._run_wsY   s	      "==GDMM?2K LMh	'!))#Q]^^bkNRmm711388:T]]Jae**++--+$'X8N8N8P8U8U8W-W$X	"%d&9&9&FY	"R"&"5"5":$+$4$4Y^^5Ew$WW&!#zz#
  $xx/H7*&.++G&*kk$(II%)XXg%6"&,,	6  ,0(::0"*(aq_`mqx|  DF  #GC"0AUVefsw  C  JL  #MC

3!Y. HHVR0&'eeHdkk&B"#%%"3		((1#*C //
SP\P\<]^ $+!Z/"hhv.%c400 II,,S1 //
SP\P\<]^!V+&1&*hhvr&:&@b"-//&""="C%gt44'.#-c4#8#8$(II$4$4S$9 (/ ++Ft{{TXT]T]eieqeq4rs*./1#'99C)#t44$<S$A $HMqM : $-  ::0"*'2*5//+q*I&1oogq&A-8__]A-N+6??;+G%0__V%<%)#C #1'2*5//+q*I&1oogq&A-8__]A-N+6??;+G%0__V%<%)#C 

3"hhvt4G(27D(A(YhRYFY'p_gko_o$+ !(Xtxx$++7V!WJzzW,!#*;;vr#:C)#t44$<S$A $HMqM : $; '#-&-kk+q&A")++gq"9)0]A)F'.{{;'?!(V!4!% 

3%)MM)[8 $ 3 3Fz[_[d[dlplxlx<y z26)X5d>N>N $ 3 3G
\`\e\emqmymy=z {37 0! N  "#*;;vr#:C)#t44$<S$A $HMqM : $; -#-&-kk+q&A")++gq"9)0])C'.{{;'?!(V!4!% 

3%)MM)[8 $ 3 3Fz[_[d[dlplxlx<y z26)X5d>N>N $ 3 3G
\`\e\emqmymy=z {37 0!} **++-- _^J {{k)$//##Ft{{DII]a]i]i,jk"& 3B)K _ X"// %!%!7!7!999!$"11 $ "&**"3"3"5"5%)%;%;%=== &/ _^^J {{k)$//##Ft{{DII]a]i]i,jk"& 3B)[  (38N8N8P8U8U8W[c8c &3 _^^J {{k)$//##Ft{{DII]a]i]i,jk"& 3B)W #*--0C0C0Hq"III #'**"3"3"5"5 7 _^^J {{k)$//##Ft{{DII]a]i]i,jk"& 3B)e % ! !? _^^^B  		 {{k)$//##Ft{{DII]a]i]i,jk"& 3B)s  Ao<n !c&"n %Cm-2&c,c)c,m4Hm-A>m-F2m-	Em-(Em-7n m*n Ao<&n )c,,'md
mm-%m8m-;=m8e;9
mm-n fn Ao<4*mm-n *h-+n 0Ao<,m;j><$m#m-$n /k20n 5Ao<mm-
m'"m-&m''m-*n -n3m64n n n n 
nn nn A o99o<c           	        #     U R                   S:X  a>  [        R                  " U R                  R                  U R
                  5      I Sh  vN nO>[        R                  " U R                  R                  U R
                  5      I Sh  vN n UR                  U l        U R                  U5        UR                  S;   a  UR                  S:X  aj  U R                  (       dY  U R                  SUR                  UR                   Vs/ s H  o"R                  5       PM     snU R
                  S.5        SU l
        UR                  S	:X  aj  U R                  (       dY  U R                  S
UR                  UR                   Vs/ s H  o"R                  5       PM     snU R
                  S.5        SU l        gg GNl GN1! [         a     gf = fs  snf s  snf 7f)z9Poll job status over HTTP once. Returns True if terminal.r   NFrg   rZ   r   r[   Tr_   r    )r$   rl   	to_threadr"   get_crawl_statusr#   get_batch_scrape_statusrA   r/   rC   r2   rL   r0   
model_dumpr3   )r4   r   r   s      r5   ru   Watcher._poll_status_once	  s    	zzW$&-&7&78U8UW[WcWc&d d,3,=,=dll>b>bdhdpdp,q&q jj

3::==zz[(##FszzdgdldlKmdl_`LLNdlKmuy  vB  vB  -C  D"&zzX%d.>.>##G

ehememLnem`a\\^emLnvz  wC  wC  .D  E#' ! !e&q 		 Ln Moss   GAF> F8F> G8F> 
F;F> A9GG!A!GGG8F> ;F> >
GG
GGc                 L    [         R                  " U R                  5       5        g r;   )rl   runr   r4   s    r5   _loopWatcher._loop  s    DLLN#r8   c                    U R                   (       a   U R                   R                  5       (       a  g U R                  R                  5         [        R
                  " U R                  SS9U l         U R                   R                  5         g )NT)targetdaemon)r(   is_aliver+   clearr)   Threadr   startr   s    r5   r   Watcher.start"  sV    <<DLL1133

 ''tzz$Gr8   c                     U R                   R                  5         U R                  (       a  U R                  R                  SS9  g g )Nr
   rY   )r+   setr(   joinr   s    r5   stopWatcher.stop)  s1    

<<LLa( r8   )r.   r-   r"   r1   r#   r$   r'   r&   r2   r3   r+   r(   r%   r0   r/   )r   r]   N)r   N)__name__
__module____qualname____firstlineno__objectstrJobKindintr   r6   r   JobTyper=   rC   r   r	   rH   rL   rR   r   boolru   r   r   r   __static_attributes__ri   r8   r5   r   r      s   
  !%'' ' 	'
 ' #' 
'@)Xwio%> )4 )G  =S =8T#s(^DTVZDZ;[ =`d = d38n  ;s ;n'` ,$)r8   r   )__doc__rl   rx   r)   typingr   r   r   r   r   r   r	   rj   typesr   r   r   utils.normalizer   r   r   r   ri   r8   r5   <module>r      sR       F F F  5 5 5 "
#
.(
)S) S)r8   