
    Ii                        S r SSKJr  SSKJr  SSKJrJr  SSKJr  SSK	r	 " S S\
\5      r\" S	S
9 " S S5      5       r " S S5      rg)z-Server lifecycle and readiness state helpers.    )annotations)	dataclass)datetimetimezone)EnumNc                  $    \ rS rSrSrSrSrSrSrg)
ServerMode   z,Possible high-level server lifecycle states.initializingrunningmaintenance N)	__name__
__module____qualname____firstlineno____doc__INITIALIZINGRUNNINGMAINTENANCE__static_attributes__r       0c:\Users\dbart\PlayPalace11\server\core\state.pyr	   r	      s    6!LGKr   r	   T)frozenc                  8    \ rS rSr% SrS\S'   S\S'   S\S'   S	rg
)ModeSnapshot   z.Simple snapshot of the current lifecycle mode.r	   mode
str | Nonemessagedatetime | None	resume_atr   N)r   r   r   r   r   __annotations__r   r   r   r   r   r      s    8
r   r   c                  n    \ rS rSrSrSS jrSS.SS jjrSS jrSS.SS	 jjrSS
 jr	SS jr
SS jrSrg)ServerLifecycleState   z8Tracks readiness/maintenance gates in a thread-safe way.c                    [         R                  U l        SU l        S U l        0 U l        [        R                  " 5       U l        g )NzServer is starting up.)	r	   r   _mode_message_override
_resume_at_gates	threadingRLock_lockselfs    r   __init__ServerLifecycleState.__init__   s3    !+!8!8
-E+/-/__&
r   N)r    c                   U R                      X R                  U'   [        R                  U l        U=(       d    U R
                  U l        SU l        SSS5        g! , (       d  f       g= f)z;Register a readiness gate that must resolve before running.N)r.   r+   r	   r   r(   r)   r*   )r0   gate_idr    s      r   add_gateServerLifecycleState.add_gate&   sH     ZZ#*KK #00DJ%,%F0F0FD""DO	 ZZs   AA
A)c                ,   U R                      U R                  R                  US5        U R                  (       dA  U R                  [        R
                  :X  a#  [        R                  U l        SU l        SU l        SSS5        g! , (       d  f       g= f)z<Mark a readiness gate as finished; run when all gates clear.N)	r.   r+   popr(   r	   r   r   r)   r*   )r0   r4   s     r   resolve_gate!ServerLifecycleState.resolve_gate/   s[     ZZKKOOGT*;;4::1H1H#H'//
)-&"& ZZs   A/B
B)r"   c                   U R                      [        R                  U l        Xl        U(       a*  UR
                  c  UR                  [        R                  S9nX l	        SSS5        g! , (       d  f       g= f)z8Switch to maintenance mode with an optional resume time.N)tzinfo)
r.   r	   r   r(   r)   r<   replacer   utcr*   r0   r    r"   s      r   enter_maintenance&ServerLifecycleState.enter_maintenance9   sR     ZZ#//DJ%,"Y--5%--X\\-B	'O ZZs   AA))
A7c                    U R                      U R                  (       a  [        R                  U l        O[        R
                  U l        SU l        SU l        SSS5        g! , (       d  f       g= f)z6Return to running mode (respecting outstanding gates).N)r.   r+   r	   r   r(   r   r)   r*   r/   s    r   exit_maintenance%ServerLifecycleState.exit_maintenanceC   sE     ZZ{{'44
'//
%)D""DO ZZs   AA!!
A/c                
   U R                      U R                  nU R                  nU R                  [        R
                  :X  a  U R                  US9nSn[        U R                  X5      sSSS5        $ ! , (       d  f       g= f)z&Return the current lifecycle snapshot.)defaultN)r.   r)   r*   r(   r	   r   _select_gate_messager   r?   s      r   snapshotServerLifecycleState.snapshotN   sa     ZZ,,GIzzZ44433G3D 	

G? ZZs   AA44
Bc                    U R                   (       aD  [        U R                   R                  5       5       H  nU R                   U   nU(       d  M  Us  $    U=(       d    S$ )z6Pick a deterministic message for initialization gates.zServer is initializing.)r+   sortedkeys)r0   rF   r4   gate_msgs       r   rG   )ServerLifecycleState._select_gate_messageY   sM     ;;!$++"2"2"45;;w/8#O 6 333r   )r+   r.   r)   r(   r*   )returnNone)r4   strr    r   rO   rP   )r4   rQ   rO   rP   )r    rQ   r"   r!   rO   rP   )rO   r   )rF   r   rO   rQ   )r   r   r   r   r   r1   r5   r9   r@   rC   rH   rG   r   r   r   r   r%   r%      s6    B' ?C #' OS (	#	@4r   r%   )r   
__future__r   dataclassesr   r   r   enumr   r,   rQ   r	   r   r%   r   r   r   <module>rU      sO    3 " ! '   d   $  E4 E4r   