
    Gdi	                     N    d dl Z d dlmZmZmZ d dlmZ d dlmZ  G d de      Z	y)    N)AnyDictOptional)Mkv)SessionBackendc                       e Zd ZdZ	 ddddededededd	f
d
ZdedefdZdedeeef   fdZ	dedeeef   de
dd	fdZy	)MkvSessionBackendaj  
    Session backend backed by mongokv.Mkv.

    Storage schema (per session_id):
        key = session_id
        value = {
            "data": { ...session dict... },
            "expires_at": <unix_epoch_seconds>
        }

    Notes:
    - Expiration is enforced on load (lazy cleanup).
    - save(..., {}, 0) deletes (matches MicroPie logout behavior).
    zsess:
key_prefix	mongo_uridb_namecollection_namer   returnNc                6    t        |||      | _        || _        y N)r   storer   )selfr   r   r   r   s        )./examples/blog/sessions/mongo_session.py__init__zMkvSessionBackend.__init__   s     G_=
$    
session_idc                 "    | j                    | S r   r
   )r   r   s     r   _kzMkvSessionBackend._k#   s    //":,//r   c                   K   |si S | j                  |      }	 | j                  j                  |       d {   }t        |t              s&	 | j                  j                  |       d {    i S |j                  d      }t        |t        t        f      rFt        j                         t        |      kD  r&	 | j                  j                  |       d {    i S |j                  di       }t        |t              r|S i S 7 # t        $ r i cY S t        $ r i cY S w xY w7 # t        $ r Y i S w xY w7 ]# t        $ r Y i S w xY ww)N
expires_atdata)r   r   getKeyError	Exception
isinstancedictremoveintfloattime)r   r   keypayloadr   r   s         r   loadzMkvSessionBackend.load&   s9    Iggj!	 JJNN3//G '4(jj'',,, I[[.
j3,/DIIK%
BS4Sjj'',,, I{{62&!$-t5253 0 	I 	I	 - I - Is   ED DD ED& +D$,D& 0A	E:D8 D6D8 (ED D!E
D!E D!!E$D& &	D3/E2D33E6D8 8	EEEEr   timeoutc                 D  K   |sy | j                  |      }|r|dk  r%	 | j                  j                  |       d {    y t	        j                         t        |      z   }||d}| j                  j                  ||       d {    y 7 O# t        $ r Y y w xY w7 w)Nr   )r   r   )r   r   r"   r   r%   r#   set)r   r   r   r)   r&   r   r'   s          r   savezMkvSessionBackend.saveH   s     ggj! w!|jj'',,, YY[3w</
 $

 jjnnS'*** -  	+sE   B B BB AB BB B 	BB BB )sessions)__name__
__module____qualname____doc__strr   r   r   r   r(   r#   r,    r   r   r	   r	      s    &  *		% "	%	% 	% 		% 	% 
	%0S 0S 0 6S  6T#s(^  6D+S +S#X + +QU +r   r	   )
r%   typingr   r   r   mongokvr   micropier   r	   r3   r   r   <module>r7      s"     & &  #U+ U+r   