2F]dZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z ej e Zde de fdZdZd ed efd Zdd d ed e e effdZdS)zLJSON persistence helpers for small agent state files (no pickle at runtime).N)iscoroutinefunction)AnyCallableUnionobjreturnct|tjr d|DSt|trd|DSt|t t fr d|DS|S)Nc,g|]}t|S _to_jsonable.0items X/opt/imunify360/venv/lib/python3.11/site-packages/defence360agent/utils/serialization.py z _to_jsonable.. 333t T""333c4i|]\}}|t|Sr r )rkvs r z _to_jsonable..s$;;;tq!<??;;;rc,g|]}t|Sr r rs rrz _to_jsonable..rr) isinstance collectionsdequedictitemslisttuple)rs rr r s#{())433s3333#t<;;syy{{;;;;#e}%%433s3333 Jrctjt|}d|}t |dd5}||dddn #1swxYwYt j||dS)z-Atomically write ``obj`` to ``path`` as JSON.z{}.tmpwutf-8encodingN)jsondumpsr formatopenwriteosreplace)pathrpayloadtmpr"s r_dumpr0sjc**++G //$  C c3 ) ) )Q JsDs A++A/2A/r-attrcfd}|S)zZDecorator: after the wrapped method runs, persist ``self.`` to ``path`` as JSON.ctjfd}tjfd}tr|S|S)Nc|g|Ri|}t|}td|t||SNzWrite %r to %rgetattrloggerdebugr0selfargskwargsresultrr1fr-s rwrapperz2serialize_attr..decorator..wrapper&s]Qt-d---f--F$%%C LL)3 5 5 5 $   MrcK|g|Ri|d{V}t|}td|t||Sr5r6r:s r async_wrapperz8serialize_attr..decorator..async_wrapper.ss1T3D333F33333333F$%%C LL)3 5 5 5 $   Mr) functoolswrapsr)r?r@rBr1r-s` r decoratorz!serialize_attr..decorator%s                         q ! ! ! rr )r-r1rEs`` rserialize_attrrF!s** r)fallbackrGc t|dd5}tj|}dddn #1swxYwYt|trt j|S|S#t$rt d|Yn1t$r%}t d|Yd}~nd}~wwxYwt|r |n|S)zRestore an object from ``path`` (JSON); a top-level list becomes a deque to match the legacy queue API, and missing/unparseable input returns ``fallback`` (called if callable).rr#r$NzCan't find %s to unserializez.Unserialize failed with %r. Returning fallback) r)r&loadrrrrFileNotFoundErrorr8warning Exceptionerrorcallable)r-rGrIres r unserializerQ=s:  $g . . . !)A,,C                c4  *$S)) )  ===5t<<<<< JJJ EqIIIIIIIIJ "(++ 988:::9s8A+5 A+9A+9A++%C CB;;C)__doc__rrCr&loggingr+asynciortypingrrr getLogger__name__r8r r0strrFobjectrQr rrrZsRR  ''''''''''''''''  8 $ $ccCs8CG::::h.>(?::::::r