@@ -372,6 +372,14 @@ export class Messenger<
372
372
getPayload : ( ) => ExtractEventPayload < Event , EventType > ;
373
373
} ) {
374
374
this . #initialEventPayloadGetters. set ( eventType , getPayload ) ;
375
+ const delegationTargets =
376
+ this . #subscriptionDelegationTargets. get ( eventType ) ;
377
+ if ( ! delegationTargets ) {
378
+ return ;
379
+ }
380
+ for ( const messenger of delegationTargets . keys ( ) ) {
381
+ messenger . registerDelegatedInitialEventPayload ( { eventType, getPayload } ) ;
382
+ }
375
383
}
376
384
377
385
/**
@@ -619,10 +627,10 @@ export class Messenger<
619
627
typeof eventType
620
628
> ;
621
629
let delegatedEventSubscriptions =
622
- this . #delegatedEventSubscriptions . get ( eventType ) ;
630
+ this . #subscriptionDelegationTargets . get ( eventType ) ;
623
631
if ( ! delegatedEventSubscriptions ) {
624
632
delegatedEventSubscriptions = new Map ( ) ;
625
- this . #delegatedEventSubscriptions . set (
633
+ this . #subscriptionDelegationTargets . set (
626
634
eventType ,
627
635
delegatedEventSubscriptions ,
628
636
) ;
@@ -639,6 +647,55 @@ export class Messenger<
639
647
}
640
648
}
641
649
650
+ /**
651
+ * Revoke delegated actions and/or events from another messenger.
652
+ *
653
+ * @param args - Arguments.
654
+ * @param args.actions - The action types to revoke.
655
+ * @param args.events - The event types to revoke.
656
+ * @param args.messenger - The messenger these actions/events were delegated to.
657
+ */
658
+ revoke < DelegatedAction extends Action , DelegatedEvent extends Event > ( {
659
+ actions = [ ] ,
660
+ events = [ ] ,
661
+ messenger,
662
+ } : {
663
+ actions ?: DelegatedAction [ 'type' ] [ ] ;
664
+ events ?: DelegatedEvent [ 'type' ] [ ] ;
665
+ messenger : DelegatedMessenger < DelegatedAction , DelegatedEvent > ;
666
+ } ) {
667
+ for ( const actionType of actions ) {
668
+ const delegationTargets = this . #actionDelegationTargets. get ( actionType ) ;
669
+ if ( ! delegationTargets || ! delegationTargets . has ( messenger ) ) {
670
+ // Nothing to revoke
671
+ continue ;
672
+ }
673
+ messenger . unregisterDelegatedActionHandler ( actionType ) ;
674
+ delegationTargets . delete ( messenger ) ;
675
+ if ( delegationTargets . size === 0 ) {
676
+ this . #actionDelegationTargets. delete ( actionType ) ;
677
+ }
678
+ }
679
+ for ( const eventType of events ) {
680
+ const delegationTargets =
681
+ this . #subscriptionDelegationTargets. get ( eventType ) ;
682
+ if ( ! delegationTargets ) {
683
+ // Nothing to revoke
684
+ continue ;
685
+ }
686
+ const delegatedSubscriber = delegationTargets . get ( messenger ) ;
687
+ if ( ! delegatedSubscriber ) {
688
+ // Nothing to revoke
689
+ continue ;
690
+ }
691
+ this . unsubscribe ( eventType , delegatedSubscriber ) ;
692
+ delegationTargets . delete ( messenger ) ;
693
+ if ( delegationTargets . size === 0 ) {
694
+ this . #subscriptionDelegationTargets. delete ( eventType ) ;
695
+ }
696
+ }
697
+ }
698
+
642
699
/**
643
700
* Determine whether the given name is within the current namespace.
644
701
*
0 commit comments