@@ -30,6 +30,7 @@ class Hub:
3030 _share_timeout_secs : int
3131 _peer_clients : dict [str , PeerClient ] # Indexed by client name
3232 _shares : dict [UUID , Share ] # Indexed by key UUID
33+ _share_timeout_tasks : dict [UUID , asyncio .Task ] # Indexed by key UUID
3334 _stop_task : asyncio .Task | None
3435
3536 def __init__ (self , name : str , share_timeout_secs : int ):
@@ -162,6 +163,8 @@ def store_share(self, share: Share):
162163 if share .user_key_id in self ._shares :
163164 LOGGER .error (f"Overwriting existing share for key ID { share .user_key_id } " )
164165 self ._shares [share .user_key_id ] = share
166+ task = asyncio .create_task (self .delete_share_after_timeout (share .user_key_id ))
167+ self ._share_timeout_tasks [share .user_key_id ] = task
165168
166169 def get_share (self , key_id : UUID ) -> Share :
167170 """
@@ -177,10 +180,12 @@ def delete_share(self, key_id: UUID):
177180 """
178181 Delete a share by key ID.
179182 """
180- try :
183+ if key_id in self ._share_timeout_tasks :
184+ task = self ._share_timeout_tasks [key_id ]
185+ task .cancel ()
186+ del self ._share_timeout_tasks [key_id ]
187+ if key_id in self ._shares :
181188 del self ._shares [key_id ]
182- except KeyError as exc :
183- raise exceptions .UnknownKeyIDError (key_id ) from exc
184189
185190 def initiate_stop (self ):
186191 """
@@ -196,3 +201,14 @@ async def _stop_after_delay(self):
196201 await asyncio .sleep (0.5 )
197202 utils .delete_pid_file ("hub" , self ._name )
198203 os .kill (os .getpid (), signal .SIGTERM )
204+
205+ async def delete_share_after_timeout (self , key_id : UUID ):
206+ """
207+ Delete a share after the share timeout.
208+ """
209+ await asyncio .sleep (self ._share_timeout_secs )
210+ try :
211+ self .delete_share (key_id )
212+ LOGGER .info (f"Deleted share for key ID { key_id } after timeout" )
213+ except exceptions .UnknownKeyIDError :
214+ LOGGER .error (f"Share for key ID { key_id } not found after timeout" )
0 commit comments