11from __future__ import annotations
22
33import dataclasses
4- from typing import TYPE_CHECKING , Final , cast
4+ from typing import TYPE_CHECKING , Final , NamedTuple , cast
55
66from mega .crypto import b64_to_a32 , decrypt_key
77
88if TYPE_CHECKING :
99 from mega .data_structures import (
1010 ComposedFileKey ,
11- ComposedFolderKey ,
1211 GetNodesResponse ,
1312 Node ,
1413 NodeID ,
14+ NodeKey ,
1515 SharedKeys ,
1616 UserID ,
1717 )
2121# An special owner used for exported (AKA public) file/folders
2222
2323
24+ class KeyLookup (NamedTuple ):
25+ full_key : ComposedFileKey | NodeKey
26+ share_key : NodeKey | None
27+
28+
2429@dataclasses .dataclass (slots = True , frozen = True )
2530class MegaVault :
2631 master_key : tuple [int , ...] = ()
@@ -43,7 +48,7 @@ def update(self, api_resp: GetNodesResponse) -> None:
4348 if key := new_keys .get (node_id ):
4449 self ._shared_keys .setdefault (owner , {})[node_id ] = key
4550
46- def __getitem__ (self , node : Node ) -> tuple [ ComposedFileKey | ComposedFolderKey , tuple [ int , ...] | None ] :
51+ def __getitem__ (self , node : Node ) -> KeyLookup :
4752 share_key : tuple [int , ...] | None = None
4853
4954 # my files/folders
@@ -74,7 +79,7 @@ def __getitem__(self, node: Node) -> tuple[ComposedFileKey | ComposedFolderKey,
7479 if len (full_key ) not in (4 , 8 ):
7580 raise RuntimeError (f"Invalid key len found for node { node .id } ({ len (full_key )} )" )
7681
77- return cast ("ComposedFileKey | ComposedFolderKey " , full_key ), share_key
82+ return KeyLookup ( cast ("ComposedFileKey | NodeKey " , full_key ), share_key )
7883
7984 def save_public_key (self , node_id : NodeID , share_key : tuple [int , ...]) -> None :
8085 self ._shared_keys [_EXPORTED ][node_id ] = share_key
0 commit comments