Skip to content

Commit c5f630e

Browse files
committed
WIP
1 parent 5fc8f2d commit c5f630e

File tree

1 file changed

+59
-2
lines changed

1 file changed

+59
-2
lines changed

packages/base-controller/src/Messenger.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,14 @@ export class Messenger<
372372
getPayload: () => ExtractEventPayload<Event, EventType>;
373373
}) {
374374
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+
}
375383
}
376384

377385
/**
@@ -619,10 +627,10 @@ export class Messenger<
619627
typeof eventType
620628
>;
621629
let delegatedEventSubscriptions =
622-
this.#delegatedEventSubscriptions.get(eventType);
630+
this.#subscriptionDelegationTargets.get(eventType);
623631
if (!delegatedEventSubscriptions) {
624632
delegatedEventSubscriptions = new Map();
625-
this.#delegatedEventSubscriptions.set(
633+
this.#subscriptionDelegationTargets.set(
626634
eventType,
627635
delegatedEventSubscriptions,
628636
);
@@ -639,6 +647,55 @@ export class Messenger<
639647
}
640648
}
641649

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+
642699
/**
643700
* Determine whether the given name is within the current namespace.
644701
*

0 commit comments

Comments
 (0)