@@ -60,6 +60,7 @@ class MediationManager:
6060 SET_TO_DEFAULT_ON_GRANTED = "set_to_default_on_granted"
6161 METADATA_KEY = "mediation"
6262 METADATA_ID = "id"
63+ KEYLIST_UPDATED_EVENT = "acapy::keylist::updated"
6364
6465 def __init__ (self , profile : Profile ):
6566 """Initialize Mediation Manager.
@@ -534,63 +535,74 @@ async def store_update_results(
534535 session: An active profile session
535536
536537 """
537- session = await self ._profile .session ()
538538 to_save : Sequence [RouteRecord ] = []
539539 to_remove : Sequence [RouteRecord ] = []
540- for updated in results :
541- if updated .result != KeylistUpdated .RESULT_SUCCESS :
542- # TODO better handle different results?
543- LOGGER .warning (
544- "Keylist update failure: %s(%s): %s" ,
545- updated .action ,
546- updated .recipient_key ,
547- updated .result ,
548- )
549- continue
550- if updated .action == KeylistUpdateRule .RULE_ADD :
551- # Multi-tenancy uses route record for internal relaying of wallets
552- # So the record could already exist. We update in that case
553- try :
554- record = await RouteRecord .retrieve_by_recipient_key (
555- session , updated .recipient_key
556- )
557- record .connection_id = connection_id
558- record .role = RouteRecord .ROLE_CLIENT
559- except StorageNotFoundError :
560- record = RouteRecord (
561- role = RouteRecord .ROLE_CLIENT ,
562- recipient_key = updated .recipient_key ,
563- connection_id = connection_id ,
564- )
565- to_save .append (record )
566- elif updated .action == KeylistUpdateRule .RULE_REMOVE :
567- try :
568- records = await RouteRecord .query (
569- session ,
570- {
571- "role" : RouteRecord .ROLE_CLIENT ,
572- "connection_id" : connection_id ,
573- "recipient_key" : updated .recipient_key ,
574- },
575- )
576- except StorageNotFoundError as err :
577- LOGGER .error (
578- "No route found while processing keylist update response: %s" ,
579- err ,
540+
541+ async with self ._profile .session () as session :
542+ for updated in results :
543+ if updated .result != KeylistUpdated .RESULT_SUCCESS :
544+ # TODO better handle different results?
545+ LOGGER .warning (
546+ "Keylist update failure: %s(%s): %s" ,
547+ updated .action ,
548+ updated .recipient_key ,
549+ updated .result ,
580550 )
581- else :
582- if len (records ) > 1 :
551+ continue
552+ if updated .action == KeylistUpdateRule .RULE_ADD :
553+ # Multi-tenancy uses route record for internal relaying of wallets
554+ # So the record could already exist. We update in that case
555+ try :
556+ record = await RouteRecord .retrieve_by_recipient_key (
557+ session , updated .recipient_key
558+ )
559+ record .connection_id = connection_id
560+ record .role = RouteRecord .ROLE_CLIENT
561+ except StorageNotFoundError :
562+ record = RouteRecord (
563+ role = RouteRecord .ROLE_CLIENT ,
564+ recipient_key = updated .recipient_key ,
565+ connection_id = connection_id ,
566+ )
567+ to_save .append (record )
568+ elif updated .action == KeylistUpdateRule .RULE_REMOVE :
569+ try :
570+ records = await RouteRecord .query (
571+ session ,
572+ {
573+ "role" : RouteRecord .ROLE_CLIENT ,
574+ "connection_id" : connection_id ,
575+ "recipient_key" : updated .recipient_key ,
576+ },
577+ )
578+ except StorageNotFoundError as err :
583579 LOGGER .error (
584- f"Too many ( { len ( records ) } ) routes found "
585- "while processing keylist update response"
580+ "No route found while processing keylist update response: %s" ,
581+ err ,
586582 )
587- record = records [0 ]
588- to_remove .append (record )
589-
590- for record_for_saving in to_save :
591- await record_for_saving .save (session , reason = "Route successfully added." )
592- for record_for_removal in to_remove :
593- await record_for_removal .delete_record (session )
583+ else :
584+ if len (records ) > 1 :
585+ LOGGER .error (
586+ f"Too many ({ len (records )} ) routes found "
587+ "while processing keylist update response"
588+ )
589+ record = records [0 ]
590+ to_remove .append (record )
591+
592+ for record_for_saving in to_save :
593+ await record_for_saving .save (
594+ session , reason = "Route successfully added."
595+ )
596+ for record_for_removal in to_remove :
597+ await record_for_removal .delete_record (session )
598+
599+ await self ._profile .notify (
600+ self .KEYLIST_UPDATED_EVENT ,
601+ {
602+ "connection_id" : connection_id ,
603+ "updated" : [update .serialize () for update in results ],
604+ },
605+ )
594606
595607 async def get_my_keylist (
596608 self , connection_id : Optional [str ] = None
0 commit comments