ó
    ýÞ j-4  ã                  ó  • % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
  SSKJr  SSKJr  SSKJrJr  SSKJrJr  SS	KJrJr  \R2                  " \5      r\" S
S15      rSS jr\	 " S S5      5       rSr S\!S'    " S S5      r"g)zESynchronous shared-stream fan-out controller for v3 thread streaming.é    )ÚannotationsN)Ú	dataclassÚfield)ÚQueue)ÚAny)ÚEventÚSubscribeParams)Úcompute_union_filterÚfilter_covers)ÚSyncEventStreamHandleÚSyncProtocolTransportÚ	completedÚfailedc                ó†  • [        U [        5      (       d  gU R                  S5      S:w  a  gU R                  S5      =(       d    0 n[        U[        5      (       d  gUR                  S5      (       d  / (       a  gUR                  S5      =(       d    0 n[        U[        5      (       d  gUR                  S5      [        ;   $ )a  Return True for a root-namespace lifecycle event marking run end.

Matches the wire shape ``{method: "lifecycle", params: {namespace: [],
data: {event: "completed" | "failed"}}}``. Subgraph lifecycle events
(non-empty namespace) do not terminate the parent run.
FÚmethodÚ	lifecycleÚparamsÚ	namespaceÚdataÚevent)Ú
isinstanceÚdictÚgetÚ_ROOT_TERMINAL_LIFECYCLE_EVENTS)r   r   r   s      Ú^/var/www/html/gaurav/venv/lib/python3.13/site-packages/langgraph_sdk/stream/sync_controller.pyÚ_is_root_terminal_lifecycler      s—   € ô �eœT×"Ñ"ØØ‡y�y�Ó˜kÓ)ØØ�Y‰Y�xÓ ×& B€FÜ�fœd×#Ñ#ØØ‡z�z�+×Ñ¦"ØØ�:‰:�fÓ×# €DÜ�dœD×!Ñ!ØØ�8‰8�GÓÔ ?Ñ?Ð?ó    c                  ó@   • \ rS rSr% S\S'   S\S'   \" \S9rS\S'   S	rg
)Ú_SyncSubscriptioné2   ÚintÚidr	   r   )Údefault_factoryz_Queue[Event | None]Úqueue© N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   Ú_Queuer$   Ú__static_attributes__r%   r   r   r   r   2   s   ‡ àƒGØÓÙ"'¸Ñ"?€EÐÖ?r   r   g      >@ÚfloatÚ_DEFAULT_RUN_START_TIMEOUTc                  ó  • \ rS rSrSrS\SSSS.             SS jjrSS	 jrSS
 jrSS jr	SS jr
SS jrSS jrS S jr S!   S"S jjrS#S jrS$S jrS#S jrS%S jrS&S jrS'S jrS(S jrS S jrSS jrSrg))ÚSyncStreamControlleré>   zKOwns the sync shared SSE handle, subscription registry, and fan-out thread.Né   gš™™™™™¹?g      $@)Úrun_start_gateÚrun_start_timeoutÚmax_reconnect_attemptsÚreconnect_backoff_baseÚreconnect_backoff_capc               ó  • Xl         SU l        0 U l        [        5       U l        S U l        S U l        S U l        SU l        [        R                  " 5       U l        S U l        X l        X0l        X@l        XPl        X`l        [        5       U l        g )Né   F)Ú
_transportÚ_next_subscription_idÚ_subscriptionsÚsetÚ_seen_event_idsÚ_shared_streamÚ_shared_stream_filterÚ_fanout_threadÚ_closedÚ	threadingÚRLockÚ_lockÚ_cursorÚ_run_start_gateÚ_run_start_timeoutÚ_max_reconnect_attemptsÚ_reconnect_backoff_baseÚ_reconnect_backoff_capÚ_drain_threads)ÚselfÚ	transportr3   r4   r5   r6   r7   s          r   Ú__init__ÚSyncStreamController.__init__A   s�   € ð $ŒØ%&ˆÔ"Ø<>ˆÔÜ),«ˆÔØ<@ˆÔØ<@ˆÔ"Ø7;ˆÔØˆŒÜ—_’_Ó&ˆŒ
Ø#'ˆŒð  .ÔØ"3ÔØ'=Ô$Ø'=Ô$Ø&;Ô#Ü58³UˆÕr   c                óÖ   • U R                      [        U R                  US9nU =R                  S-  sl        X R                  UR                  '   UsS S S 5        $ ! , (       d  f       g = f)N)r"   r   r9   )rE   r   r;   r<   r"   )rM   r   Úsubs      r   Úregister_subscriptionÚ*SyncStreamController.register_subscription_   sK   € Ø�Z‹ZÜ# t×'AÑ'AÈ&ÑQˆCØ×&Ò&¨!Ñ+Õ&Ø*-×Ñ §¡Ñ'Ø÷	 �Z�Zús   �AAÁ
A(c                óˆ   • U R                      U R                  R                  US 5        S S S 5        g ! , (       d  f       g = f©N)rE   r<   Úpop)rM   Úsubscription_ids     r   Úunregister_subscriptionÚ,SyncStreamController.unregister_subscriptionf   s)   € Ø�Z‹ZØ×Ñ×#Ñ# O°TÔ:÷ �ZŽZús	   �3³
Ac                óÞ   • U R                      [        U R                  R                  5       5      nSSS5        W H  nUR                  R                  S5        M      g! , (       d  f       N3= f)a  Wake every active subscription iterator on interrupt (run pause).

Pushes the terminal sentinel (`None`) into every subscription queue.
Iterators see `None` and return; the shared SSE keeps running so
re-iteration after `run.respond(...)` registers a fresh subscription
and resumes.
N)rE   Úlistr<   Úvaluesr$   Úput)rM   ÚsubsrR   s      r   Úsignal_pausedÚ"SyncStreamController.signal_pausedj   sK   € ð �Z‹ZÜ˜×+Ñ+×2Ñ2Ó4Ó5ˆD÷ ãˆCØ�I‰I�M‰M˜$Öò ÷ �Zús   �$AÁ
A,c                ó   • U R                   b3  U R                   R                  U R                  S9(       d  [        S5      eU R                     U R
                  b;  U R                  b.  [        U R                  [        U5      5      (       a
   S S S 5        g U R                  US9nU R
                  nU R                  R                  U R                  U5      5      U l        X l        UbM  [        R                  " U R                  U4SSS9nU R                   R#                  U5        UR%                  5         S S S 5        g ! , (       d  f       g = f)N©ÚtimeoutzSync run.start gate timeout.)ÚextraTz!langgraph-sdk-sync-rotation-drain)ÚtargetÚargsÚdaemonÚname)rG   ÚwaitrH   ÚTimeoutErrorrE   r?   r@   r   r   Ú_compute_current_unionr:   Úopen_event_streamÚ_filter_with_sincerC   ÚThreadÚ_drain_and_closerL   ÚaddÚstart)rM   Úcandidate_filterÚ
new_filterÚ
old_streamÚdrain_threads        r   Úreconcile_streamÚ%SyncStreamController.reconcile_streamw   s$  € Ø×ÑÑ+°D×4HÑ4H×4MÑ4MØ×+Ñ+ð 5Nö 5
ô Ð=Ó>Ð>Ø�Z‹Zà×#Ñ#Ñ/Ø×.Ñ.Ñ:Ü! $×"<Ñ"<¼dÐCSÓ>T×UÑUà÷ ˆZð ×4Ñ4Ð;KÐ4ÐLˆJØ×,Ñ,ˆJØ"&§/¡/×"CÑ"CØ×'Ñ'¨
Ó3ó#ˆDÔð *4Ô&ØÑ%Ü(×/Ò/Ø×0Ñ0Ø$˜ØØ<ñ	 �ð ×#Ñ#×'Ñ'¨Ô5Ø×"Ñ"Ô$÷+ �ZŽZús   ÁA D?ÂB D?Ä?
Ec                ó:  • U R                      U R                  b)  U R                  R                  5       (       a
   S S S 5        g [        R                  " U R
                  SSS9U l        U R                  R                  5         S S S 5        g ! , (       d  f       g = f)Nz langgraph-sdk-sync-stream-fanoutT)rf   ri   rh   )rE   rA   Úis_aliverC   ro   Ú_fanoutrr   )rM   s    r   Úensure_fanout_runningÚ*SyncStreamController.ensure_fanout_running“   ss   € Ø�Z‹ZØ×"Ñ"Ñ.°4×3FÑ3F×3OÑ3O×3QÑ3QØ÷ ˆZô #,×"2Ò"2Ø—|‘|Ø7Øñ#ˆDÔð
 ×Ñ×%Ñ%Ô'÷ �ZŽZús   �.BÁ?BÂ
Bc                ój  • SSK Jn   U R                     U R                  (       a
   S S S 5        g U R                  nS S S 5        Wc  g  U R                  UR                  5       H¶  nU R                     U R                  (       a   S S S 5          O�[        U R                  R                  5       5      nS S S 5        W H7  nU" X5R                  5      (       d  M  UR                  R                  U5        M9     [        U5      (       d  M¦  U R                  5         M¸      U R                     U R                  ULa   S S S 5        GM@   S S S 5        UR!                  5       nUb)  U R                  (       d  U R#                  5       (       a  GM…   U R                     U R                  R                  5        H  nUR                  R                  S 5        M      S S S 5        g ! , (       d  f       GNª= f! , (       d  f       GNE= f! [         a     Nðf = f! , (       d  f       NÑ= f! , (       d  f       g = f)Nr   ©Úmatches_subscription)Ú!langgraph_sdk.stream.subscriptionr€   rE   rB   r?   Ú_dedup_iterÚeventsr\   r<   r]   r   r$   r^   r   r`   Ú	ExceptionÚerrorÚ_reconnect_shared_stream)rM   r€   Úsharedr   ÚsubscriptionsrR   Úerrs          r   r{   ÚSyncStreamController._fanoutž   s—  € ÝJàØ—“Ø—<—<Ø÷ �ð ×,Ñ,�÷ ð ‰~ØðØ!×-Ñ-¨f¯m©mÖ<�EØŸ›ØŸ<Ÿ<Ø!÷ $™ô )-¨T×-@Ñ-@×-GÑ-GÓ-IÓ(J˜÷ $ó  -˜Ù/°·z±z×BÓBØŸI™IŸM™M¨%Ö0ñ  -ô 3°5×9Ó9Ø×*Ñ*Ö,ò =ð& —“Ø×&Ñ&¨fÒ4Ø÷ ’Ø4÷ ð —,‘,“.ˆCØ‰ t§|§|Ø×0Ñ0×2Ñ2ÚØà�Z‹ZØ×*Ñ*×1Ñ1Ö3�Ø—	‘	—‘˜dÖ#ñ 4÷ ˆZ÷I –ú÷ $žûô ó Ùðú÷ •ú÷ �Zúsj   ”G°GÁ	*H Á3G1Â	H Â#G1Â3"H Ã-H Ä
H Ä+HÆ=H$Ç
G.Ç1
H 	Ç;H È
HÈHÈ
H!È$
H2c                ó  • U R                      U R                  nS S S 5        Wc  g[        U R                  5       H|  nU R                      U R                  (       a   S S S 5          gU R                  U5      nS S S 5         U R                  R                  W5      nU R                      X@l	        S S S 5          g   g! , (       d  f       N¨= f! , (       d  f       N[= f! [         a     M°  f = f! , (       d  f         g= f)NFT)
rE   r@   ÚrangerI   rB   rn   r:   rm   r„   r?   )rM   Úbase_filterÚ_r   Ú
new_streams        r   r†   Ú-SyncStreamController._reconnect_shared_streamÊ   sÇ   € Ø�Z‹ZØ×4Ñ4ˆK÷ àÑØÜ�t×3Ñ3Ö4ˆAØ—“Ø—<—<Ø ÷ ‘ð ×0Ñ0°Ó=�÷ ðØ!Ÿ_™_×>Ñ>¸vÓF�
ð —“Ø&0Ô#÷ áñ 5ð ÷! �Zú÷
 •ûô ó Úðúç”áús;   �B<Á
CÁ'CÂCÂ(C/Â<
C
Ã
C	Ã
C,Ã+C,Ã/
C>	c                óü   • U R                   R                  5        Vs/ sH  n[        UR                  5      PM     nnUb  UR	                  [        U5      5        UR	                  SS/05        [        U5      $ s  snf )NÚchannelsr   )r<   r]   r   r   Úappendr
   )rM   re   rR   Úfilterss       r   rl   Ú+SyncStreamController._compute_current_unionÝ   sn   € ð 04×/BÑ/B×/IÑ/IÔ/KÓLÑ/K¨”4˜Ÿ
™
Ö#Ñ/KˆÐLØÑØ�N‰Nœ4 ›;Ô'ð 	�‰˜
 [ MÐ2Ô3Ü# GÓ,Ð,ùò Ms   �A9c                ór   • U R                      U R                  U5        SSS5        g! , (       d  f       g= f)zCAdvance the reconnect cursor from a command response meta sequence.N)rE   Ú_observe_seq©rM   Úseqs     r   Úobserve_applied_through_seqÚ0SyncStreamController.observe_applied_through_seqé   s!   € à�Z‹ZØ×Ñ˜cÔ"÷ �ZŽZús   �(¨
6c                ó�   • U R                      U R                  UR                  S5      5        S S S 5        g ! , (       d  f       g = f)Nr™   )rE   r—   r   )rM   r   s     r   Ú_observe_eventÚ#SyncStreamController._observe_eventî   s*   € Ø�Z‹ZØ×Ñ˜eŸi™i¨Ó.Ô/÷ �ZŽZús	   �!7·
Ac                óv   • [        U[        5      (       a$  U R                  b  XR                  :”  a  Xl        g g g rV   )r   r!   rF   r˜   s     r   r—   Ú!SyncStreamController._observe_seqò   s/   € Ü�cœ3×Ñ T§\¡\Ñ%9¸SÇ<Á<Ó=OØ�Lð >PÐr   c                óT   • [        U5      nU R                  b  U R                  US'   U$ )NÚsince)r   rF   )rM   r   Úouts      r   rn   Ú'SyncStreamController._filter_with_sinceö   s'   € Ü�6‹lˆØ�<‰<Ñ#ØŸ<™<ˆC�‰LØˆ
r   c              #  óÈ   #   • U HX  nUR                  S5      nUb,  X0R                  ;   a  M(  U R                  R                  U5        U R                  U5        Uv •  MZ     g 7f)NÚevent_id)r   r>   rq   r�   )rM   Úsourcer   r¦   s       r   r‚   Ú SyncStreamController._dedup_iterü   sY   é € ÛˆEØ—y‘y Ó,ˆHØÑ#Ø×3Ñ3Ó3ÙØ×$Ñ$×(Ñ(¨Ô2Ø×Ñ Ô&ØŒKò ùs   ‚A A"c                ó(  • SSK Jn   U R                  UR                  5       Hx  nU R                     [        U R                  R                  5       5      nSSS5        W H7  nU" X5R                  5      (       d  M  UR                  R                  U5        M9     Mz     [        R                  " [        5         UR!                  5         SSS5        U R                     U R"                  R%                  [&        R(                  " 5       5        SSS5        g! , (       d  f       NÆ= f! [         a   n[        R                  SU5         SnAN­SnAff = f! , (       d  f       N�= f! , (       d  f       g= f! [        R                  " [        5         UR!                  5         SSS5        O! , (       d  f       O= fU R                     U R"                  R%                  [&        R(                  " 5       5        SSS5        f ! , (       d  f       f = f= f)aR  Drain remaining events from an old handle before closing it.

Runs in a background thread spawned by `reconcile_stream` on rotation
so buffered events are not lost when the shared stream is replaced.
Events are dispatched to subscribers regardless of `_closed` so that
already-buffered events reach consumers before the handle is closed.
r   r   Nzrotation drain exception: %r)r�   r€   r‚   rƒ   rE   r\   r<   r]   r   r$   r^   r„   Ú_loggerÚdebugÚ
contextlibÚsuppressÚcloserL   ÚdiscardrC   Úcurrent_thread)rM   Úhandler€   r   rˆ   rR   r‰   s          r   rp   Ú%SyncStreamController._drain_and_close  sK  € õ 	Kð	HØ×)Ñ)¨&¯-©-Ö8�Ø—Z“ZÜ$(¨×)<Ñ)<×)CÑ)CÓ)EÓ$F�M÷  ã(�CÙ+¨E·:±:×>Ó>ØŸ	™	Ÿ™ eÖ,ó )ñ 9ô ×$Ò$¤YÕ/Ø—‘”÷ 0à—“Ø×#Ñ#×+Ñ+¬I×,DÒ,DÓ,FÔG÷ �÷  •Zûô
 ó 	?Ü�M‰MÐ8¸#×>Ñ>ûð	?ú÷ 0Õ/úç•ûô ×$Ò$¤YÕ/Ø—‘”÷ 0×/Ö/úà—“Ø×#Ñ#×+Ñ+¬I×,DÒ,DÓ,FÔG÷ —–ýsŽ   ˆ*D' ²$DÁ"D' Á<#D' Â9EÃ/E%Ä
D$	Ä D' Ä'
EÄ1EÅE6 ÅEÅE6 Å
E"Å%
E3Å6HÆF+Æ"	HÆ+
F9Æ5HÇ/H Ç7	HÈ 
HÈ
Hc                óº   • U R                   nU R                  n[        X2SU-  -  5      n[        R                  " SUS-  5      n[
        R                  " XE-   5        g)zCSleep with exponential backoff + jitter before a reconnect attempt.é   r   g      Ð?N)rJ   rK   ÚminÚrandomÚuniformÚtimeÚsleep)rM   ÚattemptÚbaseÚcapÚdelayÚjitters         r   Ú_reconnect_sleepÚ%SyncStreamController._reconnect_sleep  sM   € à×+Ñ+ˆØ×)Ñ)ˆÜ�C  G¡Ñ,Ó-ˆÜ—’  5¨4¡<Ó0ˆÜ�
Š
�5‘>Õ"r   c                ó  • U R                   nUc  g[        U R                  5       H£  nU R                  (       a    gUS:”  a  U R	                  US-
  5         U R
                  R                  U R                  U5      5      nU R                  nX0l        Ub3  [        R                  " [        5         UR                  5         SSS5          g   g! , (       d  f       N= f! [         a!  n[        R                  SX%5         SnAMß  SnAff = f)zÀAttempt to reopen the shared stream after a transport drop.

Returns True if a new stream was successfully opened, False if all
reconnect attempts were exhausted or the controller was closed.
NFr   r9   Tz$sync reconnect attempt %d failed: %r)r@   rŒ   rI   rB   r¿   r:   rm   rn   r?   r¬   r­   r„   r®   rª   r«   )rM   r�   rº   Ú
new_handleÚoldr‰   s         r   r†   r�   '  sâ   € ð ×0Ñ0ˆØÑØÜ˜T×9Ñ9Ö:ˆGØ�|�|ÙØ˜‹{Ø×%Ñ% g°¡kÔ2ðTØ!Ÿ_™_×>Ñ>Ø×+Ñ+¨KÓ8ó�
ð ×)Ñ)�Ø&0Ô#Ø‘?Ü#×,Ò,¬YÕ7ØŸ	™	œ÷ 8áñ ;ð" ÷ 8Õ7ûô ó TÜ—‘ÐDÀg×SÒSûðTús1   ÁACÂ0CÃCÃ
C	ÃCÃ
D
Ã)DÄD
c                óV  • U R                      U R                  (       a
   S S S 5        g SU l        U R                  nU R                  R	                  5        H  nUR
                  R                  S 5        M      S S S 5        Wb  UR                  5         U R                  nUbG  UR                  5       (       a2  [        R                  " [        5         UR                  SS9  S S S 5        U R                      [        U R                  5      nS S S 5        W HL  nUR                  5       (       d  M  [        R                  " [        5         UR                  SS9  S S S 5        MN     g ! , (       d  f       Nô= f! , (       d  f       Nœ= f! , (       d  f       Nƒ= f! , (       d  f       M“  = f)NTg      ð?rc   )rE   rB   r?   r<   r]   r$   r^   r®   rA   rz   r¬   r­   ÚRuntimeErrorÚjoinr=   rL   )rM   r‡   rR   ÚthreadÚdrain_threadsÚdrains         r   r®   ÚSyncStreamController.closeC  s"  € Ø�Z‹ZØ�|�|Ø÷ ˆZð  ˆDŒLØ×(Ñ(ˆFØ×*Ñ*×1Ñ1Ö3�Ø—	‘	—‘˜dÖ#ñ 4÷ ð ÑØ�L‰LŒNØ×$Ñ$ˆØÑ &§/¡/×"3Ñ"3Ü×$Ò$¤\Õ2Ø—‘ C�Ñ(÷ 3à�Z‹ZÜ × 3Ñ 3Ó4ˆM÷ ã"ˆEØ�~‰~×ÓÜ×(Ò(¬Õ6Ø—J‘J s�JÑ+÷ 7Ñ6ò #÷ �Zú÷ 3Õ2úç�Zú÷ 7Ö6ús5   �E&©AE&ÃE7Ã5FÅ	FÅ&
E4Å7
FÆ
FÆ
F(	)rB   rF   rL   rA   rE   rI   r;   rJ   rK   rG   rH   r>   r?   r@   r<   r:   )rN   r   r3   zthreading.Event | Noner4   r-   r5   r!   r6   r-   r7   r-   ÚreturnÚNone)r   r	   rË   r   )rX   r!   rË   rÌ   )rË   rÌ   )rs   r	   rË   rÌ   )rË   ÚboolrV   )re   zSubscribeParams | NonerË   údict[str, Any])r™   r   rË   rÌ   )r   r   rË   rÌ   )r   rÎ   rË   rÎ   )r§   r   rË   r   )r±   r   rË   rÌ   )rº   r!   rË   rÌ   )r&   r'   r(   r)   Ú__doc__r.   rO   rS   rY   r`   rw   r|   r{   r†   rl   rš   r�   r—   rn   r‚   rp   r¿   r®   r,   r%   r   r   r0   r0   >   sË   † ÙUð 26Ø#=Ø&'Ø(+Ø'+ñ;à(ð;ð /ð	;ð
 !ð;ð !$ð;ð !&ð;ð  %ð;ð 
õ;ô<ô;ô ô%ô8	(ô*$ôXð( /3ð
-Ø+ð
-à	õ
-ô#ô
0ôôôôHô2#ô÷8,r   r0   )r   r   rË   rÍ   )#rÏ   Ú
__future__r   r¬   Úloggingr¶   rC   r¸   Údataclassesr   r   r$   r   r+   Útypingr   Úlangchain_protocolr   r	   r�   r
   r   Úlanggraph_sdk.stream.transportr   r   Ú	getLoggerr&   rª   Ú	frozensetr   r   r   r.   r*   r0   r%   r   r   Ú<module>rØ      s�   ðÚ Kå "ã Û Û Û Û ß (Ý !Ý ç 5ç Q÷ð
 ×
Ò
˜HÓ
%€ñ #,¨[¸(Ð,CÓ"DÐ ô@ð, ÷@ð @ó ð@ð %)Ð ˜EÓ (÷X,ò X,r   