@metamask-previews/messenger 0.1.0-preview-93dcb549 → 0.1.0-preview-c2598d9e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -5
- package/dist/Messenger.cjs +6 -11
- package/dist/Messenger.cjs.map +1 -1
- package/dist/Messenger.d.cts +0 -15
- package/dist/Messenger.d.cts.map +1 -1
- package/dist/Messenger.d.mts +0 -15
- package/dist/Messenger.d.mts.map +1 -1
- package/dist/Messenger.mjs +5 -10
- package/dist/Messenger.mjs.map +1 -1
- package/dist/index.cjs +1 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,11 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
### Added
|
|
11
|
-
|
|
12
|
-
- Allow disabling namespace checks in unit tests using the new `MOCK_ANY_NAMESPACE` constant and `MockAnyNamespace` type ([#6420](https://github.com/MetaMask/core/pull/6420))
|
|
13
|
-
- To disable namespace checks, use `MockAnyNamespace` as the `Namespace` type parameter, and use `MOCK_ANY_NAMESPACE` as the `namespace` constructor parameter.
|
|
14
|
-
|
|
15
10
|
### Changed
|
|
16
11
|
|
|
17
12
|
- Keep delegated handlers when unregistering actions ([#6395](https://github.com/MetaMask/core/pull/6395))
|
package/dist/Messenger.cjs
CHANGED
|
@@ -12,15 +12,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
12
12
|
};
|
|
13
13
|
var _Messenger_instances, _Messenger_namespace, _Messenger_parent, _Messenger_actions, _Messenger_events, _Messenger_subscriptionDelegationTargets, _Messenger_actionDelegationTargets, _Messenger_initialEventPayloadGetters, _Messenger_eventPayloadCache, _Messenger_registerActionHandler, _Messenger_unregisterActionHandler, _Messenger_registerInitialEventPayload, _Messenger_publish, _Messenger_subscribe, _Messenger_isInCurrentNamespace;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Messenger =
|
|
16
|
-
/**
|
|
17
|
-
* Messenger namespace checks can be disabled by using this as the `namespace` constructor
|
|
18
|
-
* parameter, and using `MockAnyNamespace` as the Namespace type parameter.
|
|
19
|
-
*
|
|
20
|
-
* This is useful for mocking a variety of different actions/events in unit tests. Please do not
|
|
21
|
-
* use this in production code.
|
|
22
|
-
*/
|
|
23
|
-
exports.MOCK_ANY_NAMESPACE = 'MOCK_ANY_NAMESPACE';
|
|
15
|
+
exports.Messenger = void 0;
|
|
24
16
|
/**
|
|
25
17
|
* A message broker for "actions" and "events".
|
|
26
18
|
*
|
|
@@ -89,6 +81,7 @@ class Messenger {
|
|
|
89
81
|
* @template ActionType - A type union of Action type strings under this messenger's namespace.
|
|
90
82
|
*/
|
|
91
83
|
registerActionHandler(actionType, handler) {
|
|
84
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
92
85
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, actionType)) {
|
|
93
86
|
throw new Error(`Only allowed registering action handlers prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
94
87
|
}
|
|
@@ -128,6 +121,7 @@ class Messenger {
|
|
|
128
121
|
* @template ActionType - A type union of Action type strings under this messenger's namespace.
|
|
129
122
|
*/
|
|
130
123
|
unregisterActionHandler(actionType) {
|
|
124
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
131
125
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, actionType)) {
|
|
132
126
|
throw new Error(`Only allowed unregistering action handlers prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
133
127
|
}
|
|
@@ -178,6 +172,7 @@ class Messenger {
|
|
|
178
172
|
* @template EventType - A type union of Event type strings under this messenger's namespace.
|
|
179
173
|
*/
|
|
180
174
|
registerInitialEventPayload({ eventType, getPayload, }) {
|
|
175
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
181
176
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, eventType)) {
|
|
182
177
|
throw new Error(`Only allowed registering initial payloads for events prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
183
178
|
}
|
|
@@ -205,6 +200,7 @@ class Messenger {
|
|
|
205
200
|
* @template EventType - A type union of Event type strings under this messenger's namespace.
|
|
206
201
|
*/
|
|
207
202
|
publish(eventType, ...payload) {
|
|
203
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
208
204
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, eventType)) {
|
|
209
205
|
throw new Error(`Only allowed publishing events prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
210
206
|
}
|
|
@@ -559,7 +555,6 @@ _Messenger_namespace = new WeakMap(), _Messenger_parent = new WeakMap(), _Messen
|
|
|
559
555
|
}
|
|
560
556
|
subscribers.set(handler, metadata);
|
|
561
557
|
}, _Messenger_isInCurrentNamespace = function _Messenger_isInCurrentNamespace(name) {
|
|
562
|
-
return (__classPrivateFieldGet(this, _Messenger_namespace, "f")
|
|
563
|
-
name.startsWith(`${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:`));
|
|
558
|
+
return name.startsWith(`${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:`);
|
|
564
559
|
};
|
|
565
560
|
//# sourceMappingURL=Messenger.cjs.map
|
package/dist/Messenger.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Messenger.cjs","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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","sourcesContent":["export type ActionHandler<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = (\n ...args: ExtractActionParameters<Action, ActionType>\n) => ExtractActionResponse<Action, ActionType>;\n\nexport type ExtractActionParameters<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer HandlerArgs) => unknown;\n}\n ? HandlerArgs\n : never;\n\nexport type ExtractActionResponse<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer _) => infer HandlerReturnValue;\n}\n ? HandlerReturnValue\n : never;\n\nexport type ExtractEventHandler<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? (...payload: Payload) => void\n : never\n : never;\n\nexport type ExtractEventPayload<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? Payload\n : never\n : never;\n\nexport type GenericEventHandler = (...args: unknown[]) => void;\n\nexport type SelectorFunction<\n Event extends EventConstraint,\n EventType extends Event['type'],\n ReturnValue = unknown,\n> = (...args: ExtractEventPayload<Event, EventType>) => ReturnValue;\nexport type SelectorEventHandler<SelectorReturnValue = unknown> = (\n newValue: SelectorReturnValue,\n previousValue: SelectorReturnValue | undefined,\n) => void;\n\nexport type ActionConstraint = {\n type: NamespacedName;\n handler: ((...args: never) => unknown) | ((...args: never[]) => unknown);\n};\nexport type EventConstraint = {\n type: NamespacedName;\n payload: unknown[];\n};\n\n/**\n * Extract action types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerActions<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, infer Action, EventConstraint>\n ? Action\n : never;\n\n/**\n * Extract event types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerEvents<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, ActionConstraint, infer Event>\n ? Event\n : never;\n\n/**\n * Messenger namespace checks can be disabled by using this as the `namespace` constructor\n * parameter, and using `MockAnyNamespace` as the Namespace type parameter.\n *\n * This is useful for mocking a variety of different actions/events in unit tests. Please do not\n * use this in production code.\n */\nexport const MOCK_ANY_NAMESPACE = 'MOCK_ANY_NAMESPACE';\n\n/**\n * A type representing any namespace.\n *\n * This is useful for mocking a variety of different actions/events in unit tests. Please do not\n * use this in production code.\n */\nexport type MockAnyNamespace = string;\n\n/**\n * Metadata for a single event subscription.\n *\n * @template Event - The event this subscription is for.\n */\ntype SubscriptionMetadata<Event extends EventConstraint> = {\n /**\n * Whether this subscription is for a delegated messenger. Delegation subscriptions are ignored\n * when clearing subscriptions.\n */\n delegation: boolean;\n /**\n * The optional selector function for this subscription.\n */\n selector?: SelectorFunction<Event, Event['type']>;\n};\n\n/**\n * A map of event handlers for a specific event.\n *\n * The key is the handler function, and the value contains additional subscription metadata.\n *\n * @template Event - The event these handlers are for.\n */\ntype EventSubscriptionMap<Event extends EventConstraint> = Map<\n GenericEventHandler | SelectorEventHandler,\n SubscriptionMetadata<Event>\n>;\n\n/**\n * A namespaced string\n *\n * This type verifies that the string Name is prefixed by the string Name followed by a colon.\n *\n * @template Namespace - The namespace we're checking for.\n * @template Name - The full string, including the namespace.\n */\nexport type NamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? Name : never;\n\nexport type NotNamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? never : Name;\n\nexport type NamespacedName<Namespace extends string = string> =\n `${Namespace}:${string}`;\n\n/**\n * A messenger that actions and/or events can be delegated to.\n *\n * This is a minimal type interface to avoid complex incompatibilities resulting from generics over\n * invariant types.\n */\ntype DelegatedMessenger = Pick<\n // The type is broadened to all actions/events because some messenger methods are contravariant\n // over this type (`registerDelegatedActionHandler` and `publishDelegated` for example). If this\n // type is narrowed to just the delegated actions/events, the types for event payload and action\n // parameters would not be wide enough.\n Messenger<string, ActionConstraint, EventConstraint>,\n | '_internalPublishDelegated'\n | '_internalRegisterDelegatedActionHandler'\n | '_internalRegisterDelegatedInitialEventPayload'\n | '_internalUnregisterDelegatedActionHandler'\n>;\n\ntype StripNamespace<Namespaced extends NamespacedName> =\n Namespaced extends `${string}:${infer Name}` ? Name : never;\n\n/**\n * A message broker for \"actions\" and \"events\".\n *\n * The messenger allows registering functions as 'actions' that can be called elsewhere,\n * and it allows publishing and subscribing to events. Both actions and events are identified by\n * unique strings prefixed by a namespace (which is delimited by a colon, e.g.\n * `Namespace:actionName`).\n *\n * @template Action - A type union of all Action types.\n * @template Event - A type union of all Event types.\n * @template Namespace - The namespace for the messenger.\n */\nexport class Messenger<\n Namespace extends string,\n Action extends ActionConstraint = never,\n Event extends EventConstraint = never,\n Parent extends Messenger<\n string,\n ActionConstraint,\n EventConstraint,\n // Use `any` to avoid preventing a parent from having a parent. `any` is harmless in a type\n // constraint anyway, it's the one totally safe place to use it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n > = never,\n> {\n readonly #namespace: Namespace;\n\n /**\n * The parent messenger. All actions/events under this namespace are automatically delegated to\n * the parent messenger.\n */\n readonly #parent?: DelegatedMessenger;\n\n readonly #actions = new Map<Action['type'], Action['handler']>();\n\n readonly #events = new Map<Event['type'], EventSubscriptionMap<Event>>();\n\n /**\n * The set of messengers we've delegated events to and their event handlers, by event type.\n */\n readonly #subscriptionDelegationTargets = new Map<\n Event['type'],\n Map<DelegatedMessenger, ExtractEventHandler<Event, Event['type']>>\n >();\n\n /**\n * The set of messengers we've delegated actions to, by action type.\n */\n readonly #actionDelegationTargets = new Map<\n Action['type'],\n Set<DelegatedMessenger>\n >();\n\n /**\n * A map of functions for getting the initial event payload.\n *\n * Used only for events that represent state changes.\n */\n readonly #initialEventPayloadGetters = new Map<\n Event['type'],\n () => ExtractEventPayload<Event, Event['type']>\n >();\n\n /**\n * A cache of selector return values for their respective handlers.\n */\n readonly #eventPayloadCache = new Map<\n GenericEventHandler,\n unknown | undefined\n >();\n\n /**\n * Construct a messenger.\n *\n * If a parent messenger is given, all actions and events under this messenger's namespace will\n * be delegated to the parent automatically.\n *\n * @param args - Constructor arguments\n * @param args.namespace - The messenger namespace.\n * @param args.parent - The parent messenger.\n */\n constructor({\n namespace,\n parent,\n }: {\n namespace: Namespace;\n parent?: Action['type'] extends MessengerActions<Parent>['type']\n ? Event['type'] extends MessengerEvents<Parent>['type']\n ? Parent\n : never\n : never;\n }) {\n this.#namespace = namespace;\n this.#parent = parent;\n }\n\n /**\n * Register an action handler.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * The action being registered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n registerActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType, handler: ActionHandler<Action, ActionType>) {\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed registering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#registerActionHandler(actionType, handler);\n if (this.#parent) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // action, but this is OK because it's validated in the constructor.\n this.delegate({ actions: [actionType], messenger: this.#parent });\n }\n }\n\n #registerActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n if (this.#actions.has(actionType)) {\n throw new Error(\n `A handler for ${actionType} has already been registered`,\n );\n }\n this.#actions.set(actionType, handler);\n }\n\n /**\n * Registers action handlers for a list of methods on a messenger client\n *\n * @param messengerClient - The object that is expected to make use of the messenger.\n * @param methodNames - The names of the methods on the messenger client to register as action\n * handlers.\n * @template MessengerClient - The type expected to make use of the messenger.\n * @template MethodNames - The type union of method names to register as action handlers.\n */\n registerMethodActionHandlers<\n MessengerClient extends { name: Namespace },\n MethodNames extends keyof MessengerClient & StripNamespace<Action['type']>,\n >(messengerClient: MessengerClient, methodNames: readonly MethodNames[]) {\n for (const methodName of methodNames) {\n const method = messengerClient[methodName];\n if (typeof method === 'function') {\n const actionType = `${messengerClient.name}:${methodName}` as const;\n this.registerActionHandler(actionType, method.bind(messengerClient));\n }\n }\n }\n\n /**\n * Unregister an action handler.\n *\n * This will prevent this action from being called.\n *\n * The action being unregistered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n unregisterActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType) {\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed unregistering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#unregisterActionHandler(actionType);\n }\n\n #unregisterActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#actions.delete(actionType);\n }\n\n /**\n * Unregister all action handlers.\n *\n * This prevents all actions from being called.\n */\n clearActions() {\n for (const actionType of this.#actions.keys()) {\n this.#unregisterActionHandler(actionType);\n }\n }\n\n /**\n * Call an action.\n *\n * This function will call the action handler corresponding to the given action type, passing\n * along any parameters given.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param params - The action parameters. These must match the type of the parameters of the\n * registered action handler.\n * @throws Will throw when no handler has been registered for the given type.\n * @template ActionType - A type union of Action type strings.\n * @returns The action return value.\n */\n call<ActionType extends Action['type']>(\n actionType: ActionType,\n ...params: ExtractActionParameters<Action, ActionType>\n ): ExtractActionResponse<Action, ActionType> {\n const handler = this.#actions.get(actionType) as ActionHandler<\n Action,\n ActionType\n >;\n if (!handler) {\n throw new Error(`A handler for ${actionType} has not been registered`);\n }\n return handler(...params);\n }\n\n /**\n * Register a function for getting the initial payload for an event.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * The event type must be under the same namespace as the messenger.\n *\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n registerInitialEventPayload<\n EventType extends Event['type'] & NamespacedName<Namespace>,\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed registering initial payloads for events prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n #registerInitialEventPayload<EventType extends Event['type']>({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#initialEventPayloadGetters.set(eventType, getPayload);\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n return;\n }\n for (const messenger of delegationTargets.keys()) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n }\n\n /**\n * Publish an event.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * The event being published must be under the same namespace as the messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n publish<EventType extends Event['type'] & NamespacedName<Namespace>>(\n eventType: EventType & NamespacedName<Namespace>,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed publishing events prefixed by '${this.#namespace}:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#publish(eventType, ...payload);\n }\n\n #publish<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n const subscribers = this.#events.get(eventType);\n\n if (subscribers) {\n for (const [handler, { selector }] of subscribers.entries()) {\n try {\n if (selector) {\n const previousValue = this.#eventPayloadCache.get(handler);\n const newValue = selector(...payload);\n\n if (newValue !== previousValue) {\n this.#eventPayloadCache.set(handler, newValue);\n handler(newValue, previousValue);\n }\n } else {\n (handler as GenericEventHandler)(...payload);\n }\n } catch (error) {\n // Throw error after timeout so that it is capured as a console error\n // (and by Sentry) without interrupting the event publishing.\n setTimeout(() => {\n throw error;\n });\n }\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * Registers the given function as an event handler for the given event type.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n */\n subscribe<EventType extends Event['type']>(\n eventType: EventType,\n handler: ExtractEventHandler<Event, EventType>,\n ): void;\n\n /**\n * Subscribe to an event, with a selector.\n *\n * Registers the given handler function as an event handler for the given\n * event type. When an event is published, its payload is first passed to the\n * selector. The event handler is only called if the selector's return value\n * differs from its last known return value.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event\n * handler must match the return type of the selector.\n * @param selector - The selector function used to select relevant data from\n * the event payload. The type of the parameters for this selector must match\n * the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler: SelectorEventHandler<SelectorReturnValue>,\n selector: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void;\n\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n selector?: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void {\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This cast means the type system is not guaranteeing the handler is called with the matching\n // input selector return value. The parameter types do ensure they match when `subscribe` is\n // called, but past that point we need to make sure of that with manual review and tests\n // instead.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n this.#subscribe(eventType, widenedHandler, { delegation: false, selector });\n\n if (selector) {\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n const initialValue = selector(...getPayload());\n this.#eventPayloadCache.set(widenedHandler, initialValue);\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @param metadata - Event metadata.\n * @template SubscribedEvent - The event being subscribed to.\n * @template SelectorReturnValue - The selector return value.\n */\n #subscribe<SubscribedEvent extends EventConstraint>(\n eventType: SubscribedEvent['type'],\n handler:\n | ExtractEventHandler<SubscribedEvent, SubscribedEvent['type']>\n | SelectorEventHandler,\n metadata: SubscriptionMetadata<SubscribedEvent>,\n ): void {\n let subscribers = this.#events.get(eventType);\n if (!subscribers) {\n subscribers = new Map();\n this.#events.set(eventType, subscribers);\n }\n subscribers.set(handler, metadata);\n }\n\n /**\n * Unsubscribe from an event.\n *\n * Unregisters the given function as an event handler for the given event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler to unregister.\n * @throws Will throw when the given event handler is not registered for this event.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n unsubscribe<EventType extends Event['type'], SelectorReturnValue = unknown>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n ) {\n const subscribers = this.#events.get(eventType);\n\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This poses no risk in this case, since we never call the handler past this point.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n if (!subscribers) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n const metadata = subscribers.get(widenedHandler);\n if (!metadata) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n if (metadata.selector) {\n this.#eventPayloadCache.delete(widenedHandler);\n }\n\n subscribers.delete(widenedHandler);\n }\n\n /**\n * Clear subscriptions for a specific event.\n *\n * This will remove all subscribed handlers for this event registered from this messenger. The\n * event may still have subscribers if it has been delegated to another messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @template EventType - A type union of Event type strings.\n */\n clearEventSubscriptions<EventType extends Event['type']>(\n eventType: EventType,\n ) {\n const subscriptions = this.#events.get(eventType);\n if (!subscriptions) {\n return;\n }\n\n for (const [handler, metadata] of subscriptions.entries()) {\n if (metadata.delegation) {\n continue;\n }\n subscriptions.delete(handler);\n }\n\n if (subscriptions.size === 0) {\n this.#events.delete(eventType);\n }\n }\n\n /**\n * Clear all subscriptions.\n *\n * This will remove all subscribed handlers for all events registered from this messenger. Events\n * may still have subscribers if they are delegated to another messenger.\n */\n clearSubscriptions() {\n for (const eventType of this.#events.keys()) {\n this.clearEventSubscriptions(eventType);\n }\n }\n\n /**\n * Delegate actions and/or events to another messenger.\n *\n * The messenger these actions/events are delegated to will be able to call these actions and\n * subscribe to these events.\n *\n * Note that the messenger these actions/events are delegated to must still have these\n * actions/events included in its type definition (as part of the Action and Event type\n * parameters). Actions and events are statically type checked, they cannot be delegated\n * dynamically at runtime.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to delegate.\n * @param args.events - The event types to delegate.\n * @param args.messenger - The messenger to delegate to.\n * @template Delegatee - The messenger the actions/events are delegated to.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n delegate<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n for (const actionType of actions || []) {\n const delegatedActionHandler = (\n ...args: ExtractActionParameters<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n ) => {\n // Cast to get more specific type, for this specific action\n // The types get collapsed by `this.#actions`\n const actionHandler = this.#actions.get(actionType) as\n | ActionHandler<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n | undefined;\n if (!actionHandler) {\n throw new Error(\n `A handler for ${actionType} has not been registered`,\n );\n }\n return actionHandler(...args);\n };\n let delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets) {\n delegationTargets = new Set<DelegatedMessenger>();\n this.#actionDelegationTargets.set(actionType, delegationTargets);\n }\n if (delegationTargets.has(messenger)) {\n throw new Error(\n `The action '${actionType}' has already been delegated to this messenger`,\n );\n }\n delegationTargets.add(messenger);\n\n messenger._internalRegisterDelegatedActionHandler(\n actionType,\n delegatedActionHandler,\n );\n }\n for (const eventType of events || []) {\n const untypedSubscriber = (\n ...payload: ExtractEventPayload<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >\n ) => {\n messenger._internalPublishDelegated(eventType, ...payload);\n };\n // Cast to get more specific subscriber type for this specific event.\n // The types get collapsed here to the type union of all delegated\n // events, rather than the single subscriber type corresponding to this\n // event.\n const subscriber = untypedSubscriber as ExtractEventHandler<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >;\n let delegatedEventSubscriptions =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegatedEventSubscriptions) {\n delegatedEventSubscriptions = new Map();\n this.#subscriptionDelegationTargets.set(\n eventType,\n delegatedEventSubscriptions,\n );\n }\n if (delegatedEventSubscriptions.has(messenger)) {\n throw new Error(\n `The event '${eventType}' has already been delegated to this messenger`,\n );\n }\n delegatedEventSubscriptions.set(messenger, subscriber);\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n\n this.#subscribe(eventType, subscriber, { delegation: true });\n }\n }\n\n /**\n * Revoke delegated actions and/or events from another messenger.\n *\n * The messenger these actions/events are delegated to will no longer be able to call these\n * actions or subscribe to these events.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to revoke.\n * @param args.events - The event types to revoke.\n * @param args.messenger - The messenger these actions/events were delegated to.\n * @template Delegatee - The messenger the actions/events are being revoked from.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n revoke<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n if (messenger === this.#parent) {\n throw new Error('Cannot revoke from parent');\n }\n for (const actionType of actions || []) {\n const delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets || !delegationTargets.has(messenger)) {\n // Nothing to revoke\n continue;\n }\n messenger._internalUnregisterDelegatedActionHandler(actionType);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#actionDelegationTargets.delete(actionType);\n }\n }\n for (const eventType of events || []) {\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n // Nothing to revoke\n continue;\n }\n const delegatedSubscriber = delegationTargets.get(messenger);\n if (!delegatedSubscriber) {\n // Nothing to revoke\n continue;\n }\n this.unsubscribe(eventType, delegatedSubscriber);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#subscriptionDelegationTargets.delete(eventType);\n }\n }\n }\n\n /**\n * Register an action handler for an action delegated from another messenger.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings.\n */\n _internalRegisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n // Using wider `ActionConstraint` type here rather than `Action` because the `Action` type is\n // contravariant over the handler parameter type. Using `Action` would lead to a type error\n // here because the messenger we've delegated to supports _additional_ actions.\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n this.#registerActionHandler(actionType, handler);\n }\n\n /**\n * Unregister an action handler for an action delegated from another messenger.\n *\n * This will prevent this action from being called.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unqiue identifier for this action.\n * @template ActionType - A type union of Action type strings.\n */\n _internalUnregisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#unregisterActionHandler(actionType);\n }\n\n /**\n * Register a function for getting the initial payload for an event that has been delegated from\n * another messenger.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n */\n _internalRegisterDelegatedInitialEventPayload<\n EventType extends Event['type'],\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n /**\n * Publish an event that was delegated from another messenger.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings.\n */\n _internalPublishDelegated<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n this.#publish(eventType, ...payload);\n }\n\n /**\n * Determine whether the given name is within the current namespace.\n *\n * If the current namespace is MOCK_ANY_NAMESPACE, this check always returns true.\n *\n * @param name - The name to check\n * @returns Whether the name is within the current namespace\n */\n #isInCurrentNamespace(name: string): name is NamespacedName<Namespace> {\n return (\n this.#namespace === MOCK_ANY_NAMESPACE ||\n name.startsWith(`${this.#namespace}:`)\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Messenger.cjs","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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","sourcesContent":["export type ActionHandler<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = (\n ...args: ExtractActionParameters<Action, ActionType>\n) => ExtractActionResponse<Action, ActionType>;\n\nexport type ExtractActionParameters<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer HandlerArgs) => unknown;\n}\n ? HandlerArgs\n : never;\n\nexport type ExtractActionResponse<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer _) => infer HandlerReturnValue;\n}\n ? HandlerReturnValue\n : never;\n\nexport type ExtractEventHandler<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? (...payload: Payload) => void\n : never\n : never;\n\nexport type ExtractEventPayload<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? Payload\n : never\n : never;\n\nexport type GenericEventHandler = (...args: unknown[]) => void;\n\nexport type SelectorFunction<\n Event extends EventConstraint,\n EventType extends Event['type'],\n ReturnValue = unknown,\n> = (...args: ExtractEventPayload<Event, EventType>) => ReturnValue;\nexport type SelectorEventHandler<SelectorReturnValue = unknown> = (\n newValue: SelectorReturnValue,\n previousValue: SelectorReturnValue | undefined,\n) => void;\n\nexport type ActionConstraint = {\n type: NamespacedName;\n handler: ((...args: never) => unknown) | ((...args: never[]) => unknown);\n};\nexport type EventConstraint = {\n type: NamespacedName;\n payload: unknown[];\n};\n\n/**\n * Extract action types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerActions<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, infer Action, EventConstraint>\n ? Action\n : never;\n\n/**\n * Extract event types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerEvents<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, ActionConstraint, infer Event>\n ? Event\n : never;\n\n/**\n * Metadata for a single event subscription.\n *\n * @template Event - The event this subscription is for.\n */\ntype SubscriptionMetadata<Event extends EventConstraint> = {\n /**\n * Whether this subscription is for a delegated messenger. Delegation subscriptions are ignored\n * when clearing subscriptions.\n */\n delegation: boolean;\n /**\n * The optional selector function for this subscription.\n */\n selector?: SelectorFunction<Event, Event['type']>;\n};\n\n/**\n * A map of event handlers for a specific event.\n *\n * The key is the handler function, and the value contains additional subscription metadata.\n *\n * @template Event - The event these handlers are for.\n */\ntype EventSubscriptionMap<Event extends EventConstraint> = Map<\n GenericEventHandler | SelectorEventHandler,\n SubscriptionMetadata<Event>\n>;\n\n/**\n * A namespaced string\n *\n * This type verifies that the string Name is prefixed by the string Name followed by a colon.\n *\n * @template Namespace - The namespace we're checking for.\n * @template Name - The full string, including the namespace.\n */\nexport type NamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? Name : never;\n\nexport type NotNamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? never : Name;\n\nexport type NamespacedName<Namespace extends string = string> =\n `${Namespace}:${string}`;\n\n/**\n * A messenger that actions and/or events can be delegated to.\n *\n * This is a minimal type interface to avoid complex incompatibilities resulting from generics over\n * invariant types.\n */\ntype DelegatedMessenger = Pick<\n // The type is broadened to all actions/events because some messenger methods are contravariant\n // over this type (`registerDelegatedActionHandler` and `publishDelegated` for example). If this\n // type is narrowed to just the delegated actions/events, the types for event payload and action\n // parameters would not be wide enough.\n Messenger<string, ActionConstraint, EventConstraint>,\n | '_internalPublishDelegated'\n | '_internalRegisterDelegatedActionHandler'\n | '_internalRegisterDelegatedInitialEventPayload'\n | '_internalUnregisterDelegatedActionHandler'\n>;\n\ntype StripNamespace<Namespaced extends NamespacedName> =\n Namespaced extends `${string}:${infer Name}` ? Name : never;\n\n/**\n * A message broker for \"actions\" and \"events\".\n *\n * The messenger allows registering functions as 'actions' that can be called elsewhere,\n * and it allows publishing and subscribing to events. Both actions and events are identified by\n * unique strings prefixed by a namespace (which is delimited by a colon, e.g.\n * `Namespace:actionName`).\n *\n * @template Action - A type union of all Action types.\n * @template Event - A type union of all Event types.\n * @template Namespace - The namespace for the messenger.\n */\nexport class Messenger<\n Namespace extends string,\n Action extends ActionConstraint = never,\n Event extends EventConstraint = never,\n Parent extends Messenger<\n string,\n ActionConstraint,\n EventConstraint,\n // Use `any` to avoid preventing a parent from having a parent. `any` is harmless in a type\n // constraint anyway, it's the one totally safe place to use it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n > = never,\n> {\n readonly #namespace: Namespace;\n\n /**\n * The parent messenger. All actions/events under this namespace are automatically delegated to\n * the parent messenger.\n */\n readonly #parent?: DelegatedMessenger;\n\n readonly #actions = new Map<Action['type'], Action['handler']>();\n\n readonly #events = new Map<Event['type'], EventSubscriptionMap<Event>>();\n\n /**\n * The set of messengers we've delegated events to and their event handlers, by event type.\n */\n readonly #subscriptionDelegationTargets = new Map<\n Event['type'],\n Map<DelegatedMessenger, ExtractEventHandler<Event, Event['type']>>\n >();\n\n /**\n * The set of messengers we've delegated actions to, by action type.\n */\n readonly #actionDelegationTargets = new Map<\n Action['type'],\n Set<DelegatedMessenger>\n >();\n\n /**\n * A map of functions for getting the initial event payload.\n *\n * Used only for events that represent state changes.\n */\n readonly #initialEventPayloadGetters = new Map<\n Event['type'],\n () => ExtractEventPayload<Event, Event['type']>\n >();\n\n /**\n * A cache of selector return values for their respective handlers.\n */\n readonly #eventPayloadCache = new Map<\n GenericEventHandler,\n unknown | undefined\n >();\n\n /**\n * Construct a messenger.\n *\n * If a parent messenger is given, all actions and events under this messenger's namespace will\n * be delegated to the parent automatically.\n *\n * @param args - Constructor arguments\n * @param args.namespace - The messenger namespace.\n * @param args.parent - The parent messenger.\n */\n constructor({\n namespace,\n parent,\n }: {\n namespace: Namespace;\n parent?: Action['type'] extends MessengerActions<Parent>['type']\n ? Event['type'] extends MessengerEvents<Parent>['type']\n ? Parent\n : never\n : never;\n }) {\n this.#namespace = namespace;\n this.#parent = parent;\n }\n\n /**\n * Register an action handler.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * The action being registered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n registerActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType, handler: ActionHandler<Action, ActionType>) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed registering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#registerActionHandler(actionType, handler);\n if (this.#parent) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // action, but this is OK because it's validated in the constructor.\n this.delegate({ actions: [actionType], messenger: this.#parent });\n }\n }\n\n #registerActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n if (this.#actions.has(actionType)) {\n throw new Error(\n `A handler for ${actionType} has already been registered`,\n );\n }\n this.#actions.set(actionType, handler);\n }\n\n /**\n * Registers action handlers for a list of methods on a messenger client\n *\n * @param messengerClient - The object that is expected to make use of the messenger.\n * @param methodNames - The names of the methods on the messenger client to register as action\n * handlers.\n * @template MessengerClient - The type expected to make use of the messenger.\n * @template MethodNames - The type union of method names to register as action handlers.\n */\n registerMethodActionHandlers<\n MessengerClient extends { name: Namespace },\n MethodNames extends keyof MessengerClient & StripNamespace<Action['type']>,\n >(messengerClient: MessengerClient, methodNames: readonly MethodNames[]) {\n for (const methodName of methodNames) {\n const method = messengerClient[methodName];\n if (typeof method === 'function') {\n const actionType = `${messengerClient.name}:${methodName}` as const;\n this.registerActionHandler(actionType, method.bind(messengerClient));\n }\n }\n }\n\n /**\n * Unregister an action handler.\n *\n * This will prevent this action from being called.\n *\n * The action being unregistered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n unregisterActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed unregistering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#unregisterActionHandler(actionType);\n }\n\n #unregisterActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#actions.delete(actionType);\n }\n\n /**\n * Unregister all action handlers.\n *\n * This prevents all actions from being called.\n */\n clearActions() {\n for (const actionType of this.#actions.keys()) {\n this.#unregisterActionHandler(actionType);\n }\n }\n\n /**\n * Call an action.\n *\n * This function will call the action handler corresponding to the given action type, passing\n * along any parameters given.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param params - The action parameters. These must match the type of the parameters of the\n * registered action handler.\n * @throws Will throw when no handler has been registered for the given type.\n * @template ActionType - A type union of Action type strings.\n * @returns The action return value.\n */\n call<ActionType extends Action['type']>(\n actionType: ActionType,\n ...params: ExtractActionParameters<Action, ActionType>\n ): ExtractActionResponse<Action, ActionType> {\n const handler = this.#actions.get(actionType) as ActionHandler<\n Action,\n ActionType\n >;\n if (!handler) {\n throw new Error(`A handler for ${actionType} has not been registered`);\n }\n return handler(...params);\n }\n\n /**\n * Register a function for getting the initial payload for an event.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * The event type must be under the same namespace as the messenger.\n *\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n registerInitialEventPayload<\n EventType extends Event['type'] & NamespacedName<Namespace>,\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed registering initial payloads for events prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n #registerInitialEventPayload<EventType extends Event['type']>({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#initialEventPayloadGetters.set(eventType, getPayload);\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n return;\n }\n for (const messenger of delegationTargets.keys()) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n }\n\n /**\n * Publish an event.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * The event being published must be under the same namespace as the messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n publish<EventType extends Event['type'] & NamespacedName<Namespace>>(\n eventType: EventType & NamespacedName<Namespace>,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed publishing events prefixed by '${this.#namespace}:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#publish(eventType, ...payload);\n }\n\n #publish<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n const subscribers = this.#events.get(eventType);\n\n if (subscribers) {\n for (const [handler, { selector }] of subscribers.entries()) {\n try {\n if (selector) {\n const previousValue = this.#eventPayloadCache.get(handler);\n const newValue = selector(...payload);\n\n if (newValue !== previousValue) {\n this.#eventPayloadCache.set(handler, newValue);\n handler(newValue, previousValue);\n }\n } else {\n (handler as GenericEventHandler)(...payload);\n }\n } catch (error) {\n // Throw error after timeout so that it is capured as a console error\n // (and by Sentry) without interrupting the event publishing.\n setTimeout(() => {\n throw error;\n });\n }\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * Registers the given function as an event handler for the given event type.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n */\n subscribe<EventType extends Event['type']>(\n eventType: EventType,\n handler: ExtractEventHandler<Event, EventType>,\n ): void;\n\n /**\n * Subscribe to an event, with a selector.\n *\n * Registers the given handler function as an event handler for the given\n * event type. When an event is published, its payload is first passed to the\n * selector. The event handler is only called if the selector's return value\n * differs from its last known return value.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event\n * handler must match the return type of the selector.\n * @param selector - The selector function used to select relevant data from\n * the event payload. The type of the parameters for this selector must match\n * the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler: SelectorEventHandler<SelectorReturnValue>,\n selector: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void;\n\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n selector?: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void {\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This cast means the type system is not guaranteeing the handler is called with the matching\n // input selector return value. The parameter types do ensure they match when `subscribe` is\n // called, but past that point we need to make sure of that with manual review and tests\n // instead.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n this.#subscribe(eventType, widenedHandler, { delegation: false, selector });\n\n if (selector) {\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n const initialValue = selector(...getPayload());\n this.#eventPayloadCache.set(widenedHandler, initialValue);\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @param metadata - Event metadata.\n * @template SubscribedEvent - The event being subscribed to.\n * @template SelectorReturnValue - The selector return value.\n */\n #subscribe<SubscribedEvent extends EventConstraint>(\n eventType: SubscribedEvent['type'],\n handler:\n | ExtractEventHandler<SubscribedEvent, SubscribedEvent['type']>\n | SelectorEventHandler,\n metadata: SubscriptionMetadata<SubscribedEvent>,\n ): void {\n let subscribers = this.#events.get(eventType);\n if (!subscribers) {\n subscribers = new Map();\n this.#events.set(eventType, subscribers);\n }\n subscribers.set(handler, metadata);\n }\n\n /**\n * Unsubscribe from an event.\n *\n * Unregisters the given function as an event handler for the given event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler to unregister.\n * @throws Will throw when the given event handler is not registered for this event.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n unsubscribe<EventType extends Event['type'], SelectorReturnValue = unknown>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n ) {\n const subscribers = this.#events.get(eventType);\n\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This poses no risk in this case, since we never call the handler past this point.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n if (!subscribers) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n const metadata = subscribers.get(widenedHandler);\n if (!metadata) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n if (metadata.selector) {\n this.#eventPayloadCache.delete(widenedHandler);\n }\n\n subscribers.delete(widenedHandler);\n }\n\n /**\n * Clear subscriptions for a specific event.\n *\n * This will remove all subscribed handlers for this event registered from this messenger. The\n * event may still have subscribers if it has been delegated to another messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @template EventType - A type union of Event type strings.\n */\n clearEventSubscriptions<EventType extends Event['type']>(\n eventType: EventType,\n ) {\n const subscriptions = this.#events.get(eventType);\n if (!subscriptions) {\n return;\n }\n\n for (const [handler, metadata] of subscriptions.entries()) {\n if (metadata.delegation) {\n continue;\n }\n subscriptions.delete(handler);\n }\n\n if (subscriptions.size === 0) {\n this.#events.delete(eventType);\n }\n }\n\n /**\n * Clear all subscriptions.\n *\n * This will remove all subscribed handlers for all events registered from this messenger. Events\n * may still have subscribers if they are delegated to another messenger.\n */\n clearSubscriptions() {\n for (const eventType of this.#events.keys()) {\n this.clearEventSubscriptions(eventType);\n }\n }\n\n /**\n * Delegate actions and/or events to another messenger.\n *\n * The messenger these actions/events are delegated to will be able to call these actions and\n * subscribe to these events.\n *\n * Note that the messenger these actions/events are delegated to must still have these\n * actions/events included in its type definition (as part of the Action and Event type\n * parameters). Actions and events are statically type checked, they cannot be delegated\n * dynamically at runtime.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to delegate.\n * @param args.events - The event types to delegate.\n * @param args.messenger - The messenger to delegate to.\n * @template Delegatee - The messenger the actions/events are delegated to.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n delegate<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n for (const actionType of actions || []) {\n const delegatedActionHandler = (\n ...args: ExtractActionParameters<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n ) => {\n // Cast to get more specific type, for this specific action\n // The types get collapsed by `this.#actions`\n const actionHandler = this.#actions.get(actionType) as\n | ActionHandler<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n | undefined;\n if (!actionHandler) {\n throw new Error(\n `A handler for ${actionType} has not been registered`,\n );\n }\n return actionHandler(...args);\n };\n let delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets) {\n delegationTargets = new Set<DelegatedMessenger>();\n this.#actionDelegationTargets.set(actionType, delegationTargets);\n }\n if (delegationTargets.has(messenger)) {\n throw new Error(\n `The action '${actionType}' has already been delegated to this messenger`,\n );\n }\n delegationTargets.add(messenger);\n\n messenger._internalRegisterDelegatedActionHandler(\n actionType,\n delegatedActionHandler,\n );\n }\n for (const eventType of events || []) {\n const untypedSubscriber = (\n ...payload: ExtractEventPayload<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >\n ) => {\n messenger._internalPublishDelegated(eventType, ...payload);\n };\n // Cast to get more specific subscriber type for this specific event.\n // The types get collapsed here to the type union of all delegated\n // events, rather than the single subscriber type corresponding to this\n // event.\n const subscriber = untypedSubscriber as ExtractEventHandler<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >;\n let delegatedEventSubscriptions =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegatedEventSubscriptions) {\n delegatedEventSubscriptions = new Map();\n this.#subscriptionDelegationTargets.set(\n eventType,\n delegatedEventSubscriptions,\n );\n }\n if (delegatedEventSubscriptions.has(messenger)) {\n throw new Error(\n `The event '${eventType}' has already been delegated to this messenger`,\n );\n }\n delegatedEventSubscriptions.set(messenger, subscriber);\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n\n this.#subscribe(eventType, subscriber, { delegation: true });\n }\n }\n\n /**\n * Revoke delegated actions and/or events from another messenger.\n *\n * The messenger these actions/events are delegated to will no longer be able to call these\n * actions or subscribe to these events.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to revoke.\n * @param args.events - The event types to revoke.\n * @param args.messenger - The messenger these actions/events were delegated to.\n * @template Delegatee - The messenger the actions/events are being revoked from.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n revoke<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n if (messenger === this.#parent) {\n throw new Error('Cannot revoke from parent');\n }\n for (const actionType of actions || []) {\n const delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets || !delegationTargets.has(messenger)) {\n // Nothing to revoke\n continue;\n }\n messenger._internalUnregisterDelegatedActionHandler(actionType);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#actionDelegationTargets.delete(actionType);\n }\n }\n for (const eventType of events || []) {\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n // Nothing to revoke\n continue;\n }\n const delegatedSubscriber = delegationTargets.get(messenger);\n if (!delegatedSubscriber) {\n // Nothing to revoke\n continue;\n }\n this.unsubscribe(eventType, delegatedSubscriber);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#subscriptionDelegationTargets.delete(eventType);\n }\n }\n }\n\n /**\n * Register an action handler for an action delegated from another messenger.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings.\n */\n _internalRegisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n // Using wider `ActionConstraint` type here rather than `Action` because the `Action` type is\n // contravariant over the handler parameter type. Using `Action` would lead to a type error\n // here because the messenger we've delegated to supports _additional_ actions.\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n this.#registerActionHandler(actionType, handler);\n }\n\n /**\n * Unregister an action handler for an action delegated from another messenger.\n *\n * This will prevent this action from being called.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unqiue identifier for this action.\n * @template ActionType - A type union of Action type strings.\n */\n _internalUnregisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#unregisterActionHandler(actionType);\n }\n\n /**\n * Register a function for getting the initial payload for an event that has been delegated from\n * another messenger.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n */\n _internalRegisterDelegatedInitialEventPayload<\n EventType extends Event['type'],\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n /**\n * Publish an event that was delegated from another messenger.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings.\n */\n _internalPublishDelegated<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n this.#publish(eventType, ...payload);\n }\n\n /**\n * Determine whether the given name is within the current namespace.\n *\n * @param name - The name to check\n * @returns Whether the name is within the current namespace\n */\n #isInCurrentNamespace(name: string): name is NamespacedName<Namespace> {\n return name.startsWith(`${this.#namespace}:`);\n }\n}\n"]}
|
package/dist/Messenger.d.cts
CHANGED
|
@@ -38,21 +38,6 @@ export type MessengerActions<Subject extends Messenger<string, ActionConstraint,
|
|
|
38
38
|
* @template Subject - The messenger type to extract from.
|
|
39
39
|
*/
|
|
40
40
|
export type MessengerEvents<Subject extends Messenger<string, ActionConstraint, EventConstraint>> = Subject extends Messenger<string, ActionConstraint, infer Event> ? Event : never;
|
|
41
|
-
/**
|
|
42
|
-
* Messenger namespace checks can be disabled by using this as the `namespace` constructor
|
|
43
|
-
* parameter, and using `MockAnyNamespace` as the Namespace type parameter.
|
|
44
|
-
*
|
|
45
|
-
* This is useful for mocking a variety of different actions/events in unit tests. Please do not
|
|
46
|
-
* use this in production code.
|
|
47
|
-
*/
|
|
48
|
-
export declare const MOCK_ANY_NAMESPACE = "MOCK_ANY_NAMESPACE";
|
|
49
|
-
/**
|
|
50
|
-
* A type representing any namespace.
|
|
51
|
-
*
|
|
52
|
-
* This is useful for mocking a variety of different actions/events in unit tests. Please do not
|
|
53
|
-
* use this in production code.
|
|
54
|
-
*/
|
|
55
|
-
export type MockAnyNamespace = string;
|
|
56
41
|
/**
|
|
57
42
|
* A namespaced string
|
|
58
43
|
*
|
package/dist/Messenger.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Messenger.d.cts","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Messenger.d.cts","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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"}
|
package/dist/Messenger.d.mts
CHANGED
|
@@ -38,21 +38,6 @@ export type MessengerActions<Subject extends Messenger<string, ActionConstraint,
|
|
|
38
38
|
* @template Subject - The messenger type to extract from.
|
|
39
39
|
*/
|
|
40
40
|
export type MessengerEvents<Subject extends Messenger<string, ActionConstraint, EventConstraint>> = Subject extends Messenger<string, ActionConstraint, infer Event> ? Event : never;
|
|
41
|
-
/**
|
|
42
|
-
* Messenger namespace checks can be disabled by using this as the `namespace` constructor
|
|
43
|
-
* parameter, and using `MockAnyNamespace` as the Namespace type parameter.
|
|
44
|
-
*
|
|
45
|
-
* This is useful for mocking a variety of different actions/events in unit tests. Please do not
|
|
46
|
-
* use this in production code.
|
|
47
|
-
*/
|
|
48
|
-
export declare const MOCK_ANY_NAMESPACE = "MOCK_ANY_NAMESPACE";
|
|
49
|
-
/**
|
|
50
|
-
* A type representing any namespace.
|
|
51
|
-
*
|
|
52
|
-
* This is useful for mocking a variety of different actions/events in unit tests. Please do not
|
|
53
|
-
* use this in production code.
|
|
54
|
-
*/
|
|
55
|
-
export type MockAnyNamespace = string;
|
|
56
41
|
/**
|
|
57
42
|
* A namespaced string
|
|
58
43
|
*
|
package/dist/Messenger.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Messenger.d.mts","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Messenger.d.mts","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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"}
|
package/dist/Messenger.mjs
CHANGED
|
@@ -10,14 +10,6 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _Messenger_instances, _Messenger_namespace, _Messenger_parent, _Messenger_actions, _Messenger_events, _Messenger_subscriptionDelegationTargets, _Messenger_actionDelegationTargets, _Messenger_initialEventPayloadGetters, _Messenger_eventPayloadCache, _Messenger_registerActionHandler, _Messenger_unregisterActionHandler, _Messenger_registerInitialEventPayload, _Messenger_publish, _Messenger_subscribe, _Messenger_isInCurrentNamespace;
|
|
13
|
-
/**
|
|
14
|
-
* Messenger namespace checks can be disabled by using this as the `namespace` constructor
|
|
15
|
-
* parameter, and using `MockAnyNamespace` as the Namespace type parameter.
|
|
16
|
-
*
|
|
17
|
-
* This is useful for mocking a variety of different actions/events in unit tests. Please do not
|
|
18
|
-
* use this in production code.
|
|
19
|
-
*/
|
|
20
|
-
export const MOCK_ANY_NAMESPACE = 'MOCK_ANY_NAMESPACE';
|
|
21
13
|
/**
|
|
22
14
|
* A message broker for "actions" and "events".
|
|
23
15
|
*
|
|
@@ -86,6 +78,7 @@ export class Messenger {
|
|
|
86
78
|
* @template ActionType - A type union of Action type strings under this messenger's namespace.
|
|
87
79
|
*/
|
|
88
80
|
registerActionHandler(actionType, handler) {
|
|
81
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
89
82
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, actionType)) {
|
|
90
83
|
throw new Error(`Only allowed registering action handlers prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
91
84
|
}
|
|
@@ -125,6 +118,7 @@ export class Messenger {
|
|
|
125
118
|
* @template ActionType - A type union of Action type strings under this messenger's namespace.
|
|
126
119
|
*/
|
|
127
120
|
unregisterActionHandler(actionType) {
|
|
121
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
128
122
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, actionType)) {
|
|
129
123
|
throw new Error(`Only allowed unregistering action handlers prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
130
124
|
}
|
|
@@ -175,6 +169,7 @@ export class Messenger {
|
|
|
175
169
|
* @template EventType - A type union of Event type strings under this messenger's namespace.
|
|
176
170
|
*/
|
|
177
171
|
registerInitialEventPayload({ eventType, getPayload, }) {
|
|
172
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
178
173
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, eventType)) {
|
|
179
174
|
throw new Error(`Only allowed registering initial payloads for events prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
180
175
|
}
|
|
@@ -202,6 +197,7 @@ export class Messenger {
|
|
|
202
197
|
* @template EventType - A type union of Event type strings under this messenger's namespace.
|
|
203
198
|
*/
|
|
204
199
|
publish(eventType, ...payload) {
|
|
200
|
+
/* istanbul ignore if */ // Branch unreachable with valid types
|
|
205
201
|
if (!__classPrivateFieldGet(this, _Messenger_instances, "m", _Messenger_isInCurrentNamespace).call(this, eventType)) {
|
|
206
202
|
throw new Error(`Only allowed publishing events prefixed by '${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:'`);
|
|
207
203
|
}
|
|
@@ -555,7 +551,6 @@ _Messenger_namespace = new WeakMap(), _Messenger_parent = new WeakMap(), _Messen
|
|
|
555
551
|
}
|
|
556
552
|
subscribers.set(handler, metadata);
|
|
557
553
|
}, _Messenger_isInCurrentNamespace = function _Messenger_isInCurrentNamespace(name) {
|
|
558
|
-
return (__classPrivateFieldGet(this, _Messenger_namespace, "f")
|
|
559
|
-
name.startsWith(`${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:`));
|
|
554
|
+
return name.startsWith(`${__classPrivateFieldGet(this, _Messenger_namespace, "f")}:`);
|
|
560
555
|
};
|
|
561
556
|
//# sourceMappingURL=Messenger.mjs.map
|
package/dist/Messenger.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Messenger.mjs","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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","sourcesContent":["export type ActionHandler<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = (\n ...args: ExtractActionParameters<Action, ActionType>\n) => ExtractActionResponse<Action, ActionType>;\n\nexport type ExtractActionParameters<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer HandlerArgs) => unknown;\n}\n ? HandlerArgs\n : never;\n\nexport type ExtractActionResponse<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer _) => infer HandlerReturnValue;\n}\n ? HandlerReturnValue\n : never;\n\nexport type ExtractEventHandler<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? (...payload: Payload) => void\n : never\n : never;\n\nexport type ExtractEventPayload<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? Payload\n : never\n : never;\n\nexport type GenericEventHandler = (...args: unknown[]) => void;\n\nexport type SelectorFunction<\n Event extends EventConstraint,\n EventType extends Event['type'],\n ReturnValue = unknown,\n> = (...args: ExtractEventPayload<Event, EventType>) => ReturnValue;\nexport type SelectorEventHandler<SelectorReturnValue = unknown> = (\n newValue: SelectorReturnValue,\n previousValue: SelectorReturnValue | undefined,\n) => void;\n\nexport type ActionConstraint = {\n type: NamespacedName;\n handler: ((...args: never) => unknown) | ((...args: never[]) => unknown);\n};\nexport type EventConstraint = {\n type: NamespacedName;\n payload: unknown[];\n};\n\n/**\n * Extract action types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerActions<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, infer Action, EventConstraint>\n ? Action\n : never;\n\n/**\n * Extract event types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerEvents<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, ActionConstraint, infer Event>\n ? Event\n : never;\n\n/**\n * Messenger namespace checks can be disabled by using this as the `namespace` constructor\n * parameter, and using `MockAnyNamespace` as the Namespace type parameter.\n *\n * This is useful for mocking a variety of different actions/events in unit tests. Please do not\n * use this in production code.\n */\nexport const MOCK_ANY_NAMESPACE = 'MOCK_ANY_NAMESPACE';\n\n/**\n * A type representing any namespace.\n *\n * This is useful for mocking a variety of different actions/events in unit tests. Please do not\n * use this in production code.\n */\nexport type MockAnyNamespace = string;\n\n/**\n * Metadata for a single event subscription.\n *\n * @template Event - The event this subscription is for.\n */\ntype SubscriptionMetadata<Event extends EventConstraint> = {\n /**\n * Whether this subscription is for a delegated messenger. Delegation subscriptions are ignored\n * when clearing subscriptions.\n */\n delegation: boolean;\n /**\n * The optional selector function for this subscription.\n */\n selector?: SelectorFunction<Event, Event['type']>;\n};\n\n/**\n * A map of event handlers for a specific event.\n *\n * The key is the handler function, and the value contains additional subscription metadata.\n *\n * @template Event - The event these handlers are for.\n */\ntype EventSubscriptionMap<Event extends EventConstraint> = Map<\n GenericEventHandler | SelectorEventHandler,\n SubscriptionMetadata<Event>\n>;\n\n/**\n * A namespaced string\n *\n * This type verifies that the string Name is prefixed by the string Name followed by a colon.\n *\n * @template Namespace - The namespace we're checking for.\n * @template Name - The full string, including the namespace.\n */\nexport type NamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? Name : never;\n\nexport type NotNamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? never : Name;\n\nexport type NamespacedName<Namespace extends string = string> =\n `${Namespace}:${string}`;\n\n/**\n * A messenger that actions and/or events can be delegated to.\n *\n * This is a minimal type interface to avoid complex incompatibilities resulting from generics over\n * invariant types.\n */\ntype DelegatedMessenger = Pick<\n // The type is broadened to all actions/events because some messenger methods are contravariant\n // over this type (`registerDelegatedActionHandler` and `publishDelegated` for example). If this\n // type is narrowed to just the delegated actions/events, the types for event payload and action\n // parameters would not be wide enough.\n Messenger<string, ActionConstraint, EventConstraint>,\n | '_internalPublishDelegated'\n | '_internalRegisterDelegatedActionHandler'\n | '_internalRegisterDelegatedInitialEventPayload'\n | '_internalUnregisterDelegatedActionHandler'\n>;\n\ntype StripNamespace<Namespaced extends NamespacedName> =\n Namespaced extends `${string}:${infer Name}` ? Name : never;\n\n/**\n * A message broker for \"actions\" and \"events\".\n *\n * The messenger allows registering functions as 'actions' that can be called elsewhere,\n * and it allows publishing and subscribing to events. Both actions and events are identified by\n * unique strings prefixed by a namespace (which is delimited by a colon, e.g.\n * `Namespace:actionName`).\n *\n * @template Action - A type union of all Action types.\n * @template Event - A type union of all Event types.\n * @template Namespace - The namespace for the messenger.\n */\nexport class Messenger<\n Namespace extends string,\n Action extends ActionConstraint = never,\n Event extends EventConstraint = never,\n Parent extends Messenger<\n string,\n ActionConstraint,\n EventConstraint,\n // Use `any` to avoid preventing a parent from having a parent. `any` is harmless in a type\n // constraint anyway, it's the one totally safe place to use it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n > = never,\n> {\n readonly #namespace: Namespace;\n\n /**\n * The parent messenger. All actions/events under this namespace are automatically delegated to\n * the parent messenger.\n */\n readonly #parent?: DelegatedMessenger;\n\n readonly #actions = new Map<Action['type'], Action['handler']>();\n\n readonly #events = new Map<Event['type'], EventSubscriptionMap<Event>>();\n\n /**\n * The set of messengers we've delegated events to and their event handlers, by event type.\n */\n readonly #subscriptionDelegationTargets = new Map<\n Event['type'],\n Map<DelegatedMessenger, ExtractEventHandler<Event, Event['type']>>\n >();\n\n /**\n * The set of messengers we've delegated actions to, by action type.\n */\n readonly #actionDelegationTargets = new Map<\n Action['type'],\n Set<DelegatedMessenger>\n >();\n\n /**\n * A map of functions for getting the initial event payload.\n *\n * Used only for events that represent state changes.\n */\n readonly #initialEventPayloadGetters = new Map<\n Event['type'],\n () => ExtractEventPayload<Event, Event['type']>\n >();\n\n /**\n * A cache of selector return values for their respective handlers.\n */\n readonly #eventPayloadCache = new Map<\n GenericEventHandler,\n unknown | undefined\n >();\n\n /**\n * Construct a messenger.\n *\n * If a parent messenger is given, all actions and events under this messenger's namespace will\n * be delegated to the parent automatically.\n *\n * @param args - Constructor arguments\n * @param args.namespace - The messenger namespace.\n * @param args.parent - The parent messenger.\n */\n constructor({\n namespace,\n parent,\n }: {\n namespace: Namespace;\n parent?: Action['type'] extends MessengerActions<Parent>['type']\n ? Event['type'] extends MessengerEvents<Parent>['type']\n ? Parent\n : never\n : never;\n }) {\n this.#namespace = namespace;\n this.#parent = parent;\n }\n\n /**\n * Register an action handler.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * The action being registered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n registerActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType, handler: ActionHandler<Action, ActionType>) {\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed registering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#registerActionHandler(actionType, handler);\n if (this.#parent) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // action, but this is OK because it's validated in the constructor.\n this.delegate({ actions: [actionType], messenger: this.#parent });\n }\n }\n\n #registerActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n if (this.#actions.has(actionType)) {\n throw new Error(\n `A handler for ${actionType} has already been registered`,\n );\n }\n this.#actions.set(actionType, handler);\n }\n\n /**\n * Registers action handlers for a list of methods on a messenger client\n *\n * @param messengerClient - The object that is expected to make use of the messenger.\n * @param methodNames - The names of the methods on the messenger client to register as action\n * handlers.\n * @template MessengerClient - The type expected to make use of the messenger.\n * @template MethodNames - The type union of method names to register as action handlers.\n */\n registerMethodActionHandlers<\n MessengerClient extends { name: Namespace },\n MethodNames extends keyof MessengerClient & StripNamespace<Action['type']>,\n >(messengerClient: MessengerClient, methodNames: readonly MethodNames[]) {\n for (const methodName of methodNames) {\n const method = messengerClient[methodName];\n if (typeof method === 'function') {\n const actionType = `${messengerClient.name}:${methodName}` as const;\n this.registerActionHandler(actionType, method.bind(messengerClient));\n }\n }\n }\n\n /**\n * Unregister an action handler.\n *\n * This will prevent this action from being called.\n *\n * The action being unregistered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n unregisterActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType) {\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed unregistering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#unregisterActionHandler(actionType);\n }\n\n #unregisterActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#actions.delete(actionType);\n }\n\n /**\n * Unregister all action handlers.\n *\n * This prevents all actions from being called.\n */\n clearActions() {\n for (const actionType of this.#actions.keys()) {\n this.#unregisterActionHandler(actionType);\n }\n }\n\n /**\n * Call an action.\n *\n * This function will call the action handler corresponding to the given action type, passing\n * along any parameters given.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param params - The action parameters. These must match the type of the parameters of the\n * registered action handler.\n * @throws Will throw when no handler has been registered for the given type.\n * @template ActionType - A type union of Action type strings.\n * @returns The action return value.\n */\n call<ActionType extends Action['type']>(\n actionType: ActionType,\n ...params: ExtractActionParameters<Action, ActionType>\n ): ExtractActionResponse<Action, ActionType> {\n const handler = this.#actions.get(actionType) as ActionHandler<\n Action,\n ActionType\n >;\n if (!handler) {\n throw new Error(`A handler for ${actionType} has not been registered`);\n }\n return handler(...params);\n }\n\n /**\n * Register a function for getting the initial payload for an event.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * The event type must be under the same namespace as the messenger.\n *\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n registerInitialEventPayload<\n EventType extends Event['type'] & NamespacedName<Namespace>,\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed registering initial payloads for events prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n #registerInitialEventPayload<EventType extends Event['type']>({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#initialEventPayloadGetters.set(eventType, getPayload);\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n return;\n }\n for (const messenger of delegationTargets.keys()) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n }\n\n /**\n * Publish an event.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * The event being published must be under the same namespace as the messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n publish<EventType extends Event['type'] & NamespacedName<Namespace>>(\n eventType: EventType & NamespacedName<Namespace>,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed publishing events prefixed by '${this.#namespace}:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#publish(eventType, ...payload);\n }\n\n #publish<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n const subscribers = this.#events.get(eventType);\n\n if (subscribers) {\n for (const [handler, { selector }] of subscribers.entries()) {\n try {\n if (selector) {\n const previousValue = this.#eventPayloadCache.get(handler);\n const newValue = selector(...payload);\n\n if (newValue !== previousValue) {\n this.#eventPayloadCache.set(handler, newValue);\n handler(newValue, previousValue);\n }\n } else {\n (handler as GenericEventHandler)(...payload);\n }\n } catch (error) {\n // Throw error after timeout so that it is capured as a console error\n // (and by Sentry) without interrupting the event publishing.\n setTimeout(() => {\n throw error;\n });\n }\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * Registers the given function as an event handler for the given event type.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n */\n subscribe<EventType extends Event['type']>(\n eventType: EventType,\n handler: ExtractEventHandler<Event, EventType>,\n ): void;\n\n /**\n * Subscribe to an event, with a selector.\n *\n * Registers the given handler function as an event handler for the given\n * event type. When an event is published, its payload is first passed to the\n * selector. The event handler is only called if the selector's return value\n * differs from its last known return value.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event\n * handler must match the return type of the selector.\n * @param selector - The selector function used to select relevant data from\n * the event payload. The type of the parameters for this selector must match\n * the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler: SelectorEventHandler<SelectorReturnValue>,\n selector: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void;\n\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n selector?: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void {\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This cast means the type system is not guaranteeing the handler is called with the matching\n // input selector return value. The parameter types do ensure they match when `subscribe` is\n // called, but past that point we need to make sure of that with manual review and tests\n // instead.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n this.#subscribe(eventType, widenedHandler, { delegation: false, selector });\n\n if (selector) {\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n const initialValue = selector(...getPayload());\n this.#eventPayloadCache.set(widenedHandler, initialValue);\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @param metadata - Event metadata.\n * @template SubscribedEvent - The event being subscribed to.\n * @template SelectorReturnValue - The selector return value.\n */\n #subscribe<SubscribedEvent extends EventConstraint>(\n eventType: SubscribedEvent['type'],\n handler:\n | ExtractEventHandler<SubscribedEvent, SubscribedEvent['type']>\n | SelectorEventHandler,\n metadata: SubscriptionMetadata<SubscribedEvent>,\n ): void {\n let subscribers = this.#events.get(eventType);\n if (!subscribers) {\n subscribers = new Map();\n this.#events.set(eventType, subscribers);\n }\n subscribers.set(handler, metadata);\n }\n\n /**\n * Unsubscribe from an event.\n *\n * Unregisters the given function as an event handler for the given event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler to unregister.\n * @throws Will throw when the given event handler is not registered for this event.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n unsubscribe<EventType extends Event['type'], SelectorReturnValue = unknown>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n ) {\n const subscribers = this.#events.get(eventType);\n\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This poses no risk in this case, since we never call the handler past this point.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n if (!subscribers) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n const metadata = subscribers.get(widenedHandler);\n if (!metadata) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n if (metadata.selector) {\n this.#eventPayloadCache.delete(widenedHandler);\n }\n\n subscribers.delete(widenedHandler);\n }\n\n /**\n * Clear subscriptions for a specific event.\n *\n * This will remove all subscribed handlers for this event registered from this messenger. The\n * event may still have subscribers if it has been delegated to another messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @template EventType - A type union of Event type strings.\n */\n clearEventSubscriptions<EventType extends Event['type']>(\n eventType: EventType,\n ) {\n const subscriptions = this.#events.get(eventType);\n if (!subscriptions) {\n return;\n }\n\n for (const [handler, metadata] of subscriptions.entries()) {\n if (metadata.delegation) {\n continue;\n }\n subscriptions.delete(handler);\n }\n\n if (subscriptions.size === 0) {\n this.#events.delete(eventType);\n }\n }\n\n /**\n * Clear all subscriptions.\n *\n * This will remove all subscribed handlers for all events registered from this messenger. Events\n * may still have subscribers if they are delegated to another messenger.\n */\n clearSubscriptions() {\n for (const eventType of this.#events.keys()) {\n this.clearEventSubscriptions(eventType);\n }\n }\n\n /**\n * Delegate actions and/or events to another messenger.\n *\n * The messenger these actions/events are delegated to will be able to call these actions and\n * subscribe to these events.\n *\n * Note that the messenger these actions/events are delegated to must still have these\n * actions/events included in its type definition (as part of the Action and Event type\n * parameters). Actions and events are statically type checked, they cannot be delegated\n * dynamically at runtime.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to delegate.\n * @param args.events - The event types to delegate.\n * @param args.messenger - The messenger to delegate to.\n * @template Delegatee - The messenger the actions/events are delegated to.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n delegate<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n for (const actionType of actions || []) {\n const delegatedActionHandler = (\n ...args: ExtractActionParameters<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n ) => {\n // Cast to get more specific type, for this specific action\n // The types get collapsed by `this.#actions`\n const actionHandler = this.#actions.get(actionType) as\n | ActionHandler<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n | undefined;\n if (!actionHandler) {\n throw new Error(\n `A handler for ${actionType} has not been registered`,\n );\n }\n return actionHandler(...args);\n };\n let delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets) {\n delegationTargets = new Set<DelegatedMessenger>();\n this.#actionDelegationTargets.set(actionType, delegationTargets);\n }\n if (delegationTargets.has(messenger)) {\n throw new Error(\n `The action '${actionType}' has already been delegated to this messenger`,\n );\n }\n delegationTargets.add(messenger);\n\n messenger._internalRegisterDelegatedActionHandler(\n actionType,\n delegatedActionHandler,\n );\n }\n for (const eventType of events || []) {\n const untypedSubscriber = (\n ...payload: ExtractEventPayload<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >\n ) => {\n messenger._internalPublishDelegated(eventType, ...payload);\n };\n // Cast to get more specific subscriber type for this specific event.\n // The types get collapsed here to the type union of all delegated\n // events, rather than the single subscriber type corresponding to this\n // event.\n const subscriber = untypedSubscriber as ExtractEventHandler<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >;\n let delegatedEventSubscriptions =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegatedEventSubscriptions) {\n delegatedEventSubscriptions = new Map();\n this.#subscriptionDelegationTargets.set(\n eventType,\n delegatedEventSubscriptions,\n );\n }\n if (delegatedEventSubscriptions.has(messenger)) {\n throw new Error(\n `The event '${eventType}' has already been delegated to this messenger`,\n );\n }\n delegatedEventSubscriptions.set(messenger, subscriber);\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n\n this.#subscribe(eventType, subscriber, { delegation: true });\n }\n }\n\n /**\n * Revoke delegated actions and/or events from another messenger.\n *\n * The messenger these actions/events are delegated to will no longer be able to call these\n * actions or subscribe to these events.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to revoke.\n * @param args.events - The event types to revoke.\n * @param args.messenger - The messenger these actions/events were delegated to.\n * @template Delegatee - The messenger the actions/events are being revoked from.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n revoke<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n if (messenger === this.#parent) {\n throw new Error('Cannot revoke from parent');\n }\n for (const actionType of actions || []) {\n const delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets || !delegationTargets.has(messenger)) {\n // Nothing to revoke\n continue;\n }\n messenger._internalUnregisterDelegatedActionHandler(actionType);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#actionDelegationTargets.delete(actionType);\n }\n }\n for (const eventType of events || []) {\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n // Nothing to revoke\n continue;\n }\n const delegatedSubscriber = delegationTargets.get(messenger);\n if (!delegatedSubscriber) {\n // Nothing to revoke\n continue;\n }\n this.unsubscribe(eventType, delegatedSubscriber);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#subscriptionDelegationTargets.delete(eventType);\n }\n }\n }\n\n /**\n * Register an action handler for an action delegated from another messenger.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings.\n */\n _internalRegisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n // Using wider `ActionConstraint` type here rather than `Action` because the `Action` type is\n // contravariant over the handler parameter type. Using `Action` would lead to a type error\n // here because the messenger we've delegated to supports _additional_ actions.\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n this.#registerActionHandler(actionType, handler);\n }\n\n /**\n * Unregister an action handler for an action delegated from another messenger.\n *\n * This will prevent this action from being called.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unqiue identifier for this action.\n * @template ActionType - A type union of Action type strings.\n */\n _internalUnregisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#unregisterActionHandler(actionType);\n }\n\n /**\n * Register a function for getting the initial payload for an event that has been delegated from\n * another messenger.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n */\n _internalRegisterDelegatedInitialEventPayload<\n EventType extends Event['type'],\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n /**\n * Publish an event that was delegated from another messenger.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings.\n */\n _internalPublishDelegated<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n this.#publish(eventType, ...payload);\n }\n\n /**\n * Determine whether the given name is within the current namespace.\n *\n * If the current namespace is MOCK_ANY_NAMESPACE, this check always returns true.\n *\n * @param name - The name to check\n * @returns Whether the name is within the current namespace\n */\n #isInCurrentNamespace(name: string): name is NamespacedName<Namespace> {\n return (\n this.#namespace === MOCK_ANY_NAMESPACE ||\n name.startsWith(`${this.#namespace}:`)\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Messenger.mjs","sourceRoot":"","sources":["../src/Messenger.ts"],"names":[],"mappings":"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","sourcesContent":["export type ActionHandler<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = (\n ...args: ExtractActionParameters<Action, ActionType>\n) => ExtractActionResponse<Action, ActionType>;\n\nexport type ExtractActionParameters<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer HandlerArgs) => unknown;\n}\n ? HandlerArgs\n : never;\n\nexport type ExtractActionResponse<\n Action extends ActionConstraint,\n ActionType = Action['type'],\n> = Action extends {\n type: ActionType;\n handler: (...args: infer _) => infer HandlerReturnValue;\n}\n ? HandlerReturnValue\n : never;\n\nexport type ExtractEventHandler<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? (...payload: Payload) => void\n : never\n : never;\n\nexport type ExtractEventPayload<\n Event extends EventConstraint,\n EventType = Event['type'],\n> = Event extends {\n type: EventType;\n payload: infer Payload;\n}\n ? Payload extends unknown[]\n ? Payload\n : never\n : never;\n\nexport type GenericEventHandler = (...args: unknown[]) => void;\n\nexport type SelectorFunction<\n Event extends EventConstraint,\n EventType extends Event['type'],\n ReturnValue = unknown,\n> = (...args: ExtractEventPayload<Event, EventType>) => ReturnValue;\nexport type SelectorEventHandler<SelectorReturnValue = unknown> = (\n newValue: SelectorReturnValue,\n previousValue: SelectorReturnValue | undefined,\n) => void;\n\nexport type ActionConstraint = {\n type: NamespacedName;\n handler: ((...args: never) => unknown) | ((...args: never[]) => unknown);\n};\nexport type EventConstraint = {\n type: NamespacedName;\n payload: unknown[];\n};\n\n/**\n * Extract action types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerActions<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, infer Action, EventConstraint>\n ? Action\n : never;\n\n/**\n * Extract event types from a Messenger type.\n *\n * @template Subject - The messenger type to extract from.\n */\nexport type MessengerEvents<\n Subject extends Messenger<string, ActionConstraint, EventConstraint>,\n> =\n Subject extends Messenger<string, ActionConstraint, infer Event>\n ? Event\n : never;\n\n/**\n * Metadata for a single event subscription.\n *\n * @template Event - The event this subscription is for.\n */\ntype SubscriptionMetadata<Event extends EventConstraint> = {\n /**\n * Whether this subscription is for a delegated messenger. Delegation subscriptions are ignored\n * when clearing subscriptions.\n */\n delegation: boolean;\n /**\n * The optional selector function for this subscription.\n */\n selector?: SelectorFunction<Event, Event['type']>;\n};\n\n/**\n * A map of event handlers for a specific event.\n *\n * The key is the handler function, and the value contains additional subscription metadata.\n *\n * @template Event - The event these handlers are for.\n */\ntype EventSubscriptionMap<Event extends EventConstraint> = Map<\n GenericEventHandler | SelectorEventHandler,\n SubscriptionMetadata<Event>\n>;\n\n/**\n * A namespaced string\n *\n * This type verifies that the string Name is prefixed by the string Name followed by a colon.\n *\n * @template Namespace - The namespace we're checking for.\n * @template Name - The full string, including the namespace.\n */\nexport type NamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? Name : never;\n\nexport type NotNamespacedBy<\n Namespace extends string,\n Name extends string,\n> = Name extends `${Namespace}:${string}` ? never : Name;\n\nexport type NamespacedName<Namespace extends string = string> =\n `${Namespace}:${string}`;\n\n/**\n * A messenger that actions and/or events can be delegated to.\n *\n * This is a minimal type interface to avoid complex incompatibilities resulting from generics over\n * invariant types.\n */\ntype DelegatedMessenger = Pick<\n // The type is broadened to all actions/events because some messenger methods are contravariant\n // over this type (`registerDelegatedActionHandler` and `publishDelegated` for example). If this\n // type is narrowed to just the delegated actions/events, the types for event payload and action\n // parameters would not be wide enough.\n Messenger<string, ActionConstraint, EventConstraint>,\n | '_internalPublishDelegated'\n | '_internalRegisterDelegatedActionHandler'\n | '_internalRegisterDelegatedInitialEventPayload'\n | '_internalUnregisterDelegatedActionHandler'\n>;\n\ntype StripNamespace<Namespaced extends NamespacedName> =\n Namespaced extends `${string}:${infer Name}` ? Name : never;\n\n/**\n * A message broker for \"actions\" and \"events\".\n *\n * The messenger allows registering functions as 'actions' that can be called elsewhere,\n * and it allows publishing and subscribing to events. Both actions and events are identified by\n * unique strings prefixed by a namespace (which is delimited by a colon, e.g.\n * `Namespace:actionName`).\n *\n * @template Action - A type union of all Action types.\n * @template Event - A type union of all Event types.\n * @template Namespace - The namespace for the messenger.\n */\nexport class Messenger<\n Namespace extends string,\n Action extends ActionConstraint = never,\n Event extends EventConstraint = never,\n Parent extends Messenger<\n string,\n ActionConstraint,\n EventConstraint,\n // Use `any` to avoid preventing a parent from having a parent. `any` is harmless in a type\n // constraint anyway, it's the one totally safe place to use it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n > = never,\n> {\n readonly #namespace: Namespace;\n\n /**\n * The parent messenger. All actions/events under this namespace are automatically delegated to\n * the parent messenger.\n */\n readonly #parent?: DelegatedMessenger;\n\n readonly #actions = new Map<Action['type'], Action['handler']>();\n\n readonly #events = new Map<Event['type'], EventSubscriptionMap<Event>>();\n\n /**\n * The set of messengers we've delegated events to and their event handlers, by event type.\n */\n readonly #subscriptionDelegationTargets = new Map<\n Event['type'],\n Map<DelegatedMessenger, ExtractEventHandler<Event, Event['type']>>\n >();\n\n /**\n * The set of messengers we've delegated actions to, by action type.\n */\n readonly #actionDelegationTargets = new Map<\n Action['type'],\n Set<DelegatedMessenger>\n >();\n\n /**\n * A map of functions for getting the initial event payload.\n *\n * Used only for events that represent state changes.\n */\n readonly #initialEventPayloadGetters = new Map<\n Event['type'],\n () => ExtractEventPayload<Event, Event['type']>\n >();\n\n /**\n * A cache of selector return values for their respective handlers.\n */\n readonly #eventPayloadCache = new Map<\n GenericEventHandler,\n unknown | undefined\n >();\n\n /**\n * Construct a messenger.\n *\n * If a parent messenger is given, all actions and events under this messenger's namespace will\n * be delegated to the parent automatically.\n *\n * @param args - Constructor arguments\n * @param args.namespace - The messenger namespace.\n * @param args.parent - The parent messenger.\n */\n constructor({\n namespace,\n parent,\n }: {\n namespace: Namespace;\n parent?: Action['type'] extends MessengerActions<Parent>['type']\n ? Event['type'] extends MessengerEvents<Parent>['type']\n ? Parent\n : never\n : never;\n }) {\n this.#namespace = namespace;\n this.#parent = parent;\n }\n\n /**\n * Register an action handler.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * The action being registered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n registerActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType, handler: ActionHandler<Action, ActionType>) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed registering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#registerActionHandler(actionType, handler);\n if (this.#parent) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // action, but this is OK because it's validated in the constructor.\n this.delegate({ actions: [actionType], messenger: this.#parent });\n }\n }\n\n #registerActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n if (this.#actions.has(actionType)) {\n throw new Error(\n `A handler for ${actionType} has already been registered`,\n );\n }\n this.#actions.set(actionType, handler);\n }\n\n /**\n * Registers action handlers for a list of methods on a messenger client\n *\n * @param messengerClient - The object that is expected to make use of the messenger.\n * @param methodNames - The names of the methods on the messenger client to register as action\n * handlers.\n * @template MessengerClient - The type expected to make use of the messenger.\n * @template MethodNames - The type union of method names to register as action handlers.\n */\n registerMethodActionHandlers<\n MessengerClient extends { name: Namespace },\n MethodNames extends keyof MessengerClient & StripNamespace<Action['type']>,\n >(messengerClient: MessengerClient, methodNames: readonly MethodNames[]) {\n for (const methodName of methodNames) {\n const method = messengerClient[methodName];\n if (typeof method === 'function') {\n const actionType = `${messengerClient.name}:${methodName}` as const;\n this.registerActionHandler(actionType, method.bind(messengerClient));\n }\n }\n }\n\n /**\n * Unregister an action handler.\n *\n * This will prevent this action from being called.\n *\n * The action being unregistered must be under the same namespace as the messenger.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @template ActionType - A type union of Action type strings under this messenger's namespace.\n */\n unregisterActionHandler<\n ActionType extends Action['type'] & NamespacedName<Namespace>,\n >(actionType: ActionType) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(actionType)) {\n throw new Error(\n `Only allowed unregistering action handlers prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n this.#unregisterActionHandler(actionType);\n }\n\n #unregisterActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#actions.delete(actionType);\n }\n\n /**\n * Unregister all action handlers.\n *\n * This prevents all actions from being called.\n */\n clearActions() {\n for (const actionType of this.#actions.keys()) {\n this.#unregisterActionHandler(actionType);\n }\n }\n\n /**\n * Call an action.\n *\n * This function will call the action handler corresponding to the given action type, passing\n * along any parameters given.\n *\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param params - The action parameters. These must match the type of the parameters of the\n * registered action handler.\n * @throws Will throw when no handler has been registered for the given type.\n * @template ActionType - A type union of Action type strings.\n * @returns The action return value.\n */\n call<ActionType extends Action['type']>(\n actionType: ActionType,\n ...params: ExtractActionParameters<Action, ActionType>\n ): ExtractActionResponse<Action, ActionType> {\n const handler = this.#actions.get(actionType) as ActionHandler<\n Action,\n ActionType\n >;\n if (!handler) {\n throw new Error(`A handler for ${actionType} has not been registered`);\n }\n return handler(...params);\n }\n\n /**\n * Register a function for getting the initial payload for an event.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * The event type must be under the same namespace as the messenger.\n *\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n registerInitialEventPayload<\n EventType extends Event['type'] & NamespacedName<Namespace>,\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed registering initial payloads for events prefixed by '${\n this.#namespace\n }:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n #registerInitialEventPayload<EventType extends Event['type']>({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#initialEventPayloadGetters.set(eventType, getPayload);\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n return;\n }\n for (const messenger of delegationTargets.keys()) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n }\n\n /**\n * Publish an event.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * The event being published must be under the same namespace as the messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings under this messenger's namespace.\n */\n publish<EventType extends Event['type'] & NamespacedName<Namespace>>(\n eventType: EventType & NamespacedName<Namespace>,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n /* istanbul ignore if */ // Branch unreachable with valid types\n if (!this.#isInCurrentNamespace(eventType)) {\n throw new Error(\n `Only allowed publishing events prefixed by '${this.#namespace}:'`,\n );\n }\n if (\n this.#parent &&\n !this.#subscriptionDelegationTargets.get(eventType)?.has(this.#parent)\n ) {\n // @ts-expect-error The parent type isn't constructed in a way that proves it supports this\n // event, but this is OK because it's validated in the constructor.\n this.delegate({ events: [eventType], messenger: this.#parent });\n }\n this.#publish(eventType, ...payload);\n }\n\n #publish<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n const subscribers = this.#events.get(eventType);\n\n if (subscribers) {\n for (const [handler, { selector }] of subscribers.entries()) {\n try {\n if (selector) {\n const previousValue = this.#eventPayloadCache.get(handler);\n const newValue = selector(...payload);\n\n if (newValue !== previousValue) {\n this.#eventPayloadCache.set(handler, newValue);\n handler(newValue, previousValue);\n }\n } else {\n (handler as GenericEventHandler)(...payload);\n }\n } catch (error) {\n // Throw error after timeout so that it is capured as a console error\n // (and by Sentry) without interrupting the event publishing.\n setTimeout(() => {\n throw error;\n });\n }\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * Registers the given function as an event handler for the given event type.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n */\n subscribe<EventType extends Event['type']>(\n eventType: EventType,\n handler: ExtractEventHandler<Event, EventType>,\n ): void;\n\n /**\n * Subscribe to an event, with a selector.\n *\n * Registers the given handler function as an event handler for the given\n * event type. When an event is published, its payload is first passed to the\n * selector. The event handler is only called if the selector's return value\n * differs from its last known return value.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event\n * handler must match the return type of the selector.\n * @param selector - The selector function used to select relevant data from\n * the event payload. The type of the parameters for this selector must match\n * the type of the payload for this event type.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler: SelectorEventHandler<SelectorReturnValue>,\n selector: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void;\n\n subscribe<EventType extends Event['type'], SelectorReturnValue>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n selector?: SelectorFunction<Event, EventType, SelectorReturnValue>,\n ): void {\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This cast means the type system is not guaranteeing the handler is called with the matching\n // input selector return value. The parameter types do ensure they match when `subscribe` is\n // called, but past that point we need to make sure of that with manual review and tests\n // instead.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n this.#subscribe(eventType, widenedHandler, { delegation: false, selector });\n\n if (selector) {\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n const initialValue = selector(...getPayload());\n this.#eventPayloadCache.set(widenedHandler, initialValue);\n }\n }\n }\n\n /**\n * Subscribe to an event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler. The type of the parameters for this event handler must\n * match the type of the payload for this event type.\n * @param metadata - Event metadata.\n * @template SubscribedEvent - The event being subscribed to.\n * @template SelectorReturnValue - The selector return value.\n */\n #subscribe<SubscribedEvent extends EventConstraint>(\n eventType: SubscribedEvent['type'],\n handler:\n | ExtractEventHandler<SubscribedEvent, SubscribedEvent['type']>\n | SelectorEventHandler,\n metadata: SubscriptionMetadata<SubscribedEvent>,\n ): void {\n let subscribers = this.#events.get(eventType);\n if (!subscribers) {\n subscribers = new Map();\n this.#events.set(eventType, subscribers);\n }\n subscribers.set(handler, metadata);\n }\n\n /**\n * Unsubscribe from an event.\n *\n * Unregisters the given function as an event handler for the given event.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param handler - The event handler to unregister.\n * @throws Will throw when the given event handler is not registered for this event.\n * @template EventType - A type union of Event type strings.\n * @template SelectorReturnValue - The selector return value.\n */\n unsubscribe<EventType extends Event['type'], SelectorReturnValue = unknown>(\n eventType: EventType,\n handler:\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler<SelectorReturnValue>,\n ) {\n const subscribers = this.#events.get(eventType);\n\n // Widen type of event handler by dropping ReturnType parameter.\n //\n // We need to drop it here because it's used as the parameter to the event handler, and\n // functions in general are contravariant over the parameter type. This means the type is no\n // longer valid once it's added to a broader type union with other handlers (because as far\n // as TypeScript knows, we might call the handler with output from a different selector).\n //\n // This poses no risk in this case, since we never call the handler past this point.\n const widenedHandler = handler as\n | ExtractEventHandler<Event, EventType>\n | SelectorEventHandler;\n if (!subscribers) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n const metadata = subscribers.get(widenedHandler);\n if (!metadata) {\n throw new Error(`Subscription not found for event: ${eventType}`);\n }\n if (metadata.selector) {\n this.#eventPayloadCache.delete(widenedHandler);\n }\n\n subscribers.delete(widenedHandler);\n }\n\n /**\n * Clear subscriptions for a specific event.\n *\n * This will remove all subscribed handlers for this event registered from this messenger. The\n * event may still have subscribers if it has been delegated to another messenger.\n *\n * @param eventType - The event type. This is a unique identifier for this event.\n * @template EventType - A type union of Event type strings.\n */\n clearEventSubscriptions<EventType extends Event['type']>(\n eventType: EventType,\n ) {\n const subscriptions = this.#events.get(eventType);\n if (!subscriptions) {\n return;\n }\n\n for (const [handler, metadata] of subscriptions.entries()) {\n if (metadata.delegation) {\n continue;\n }\n subscriptions.delete(handler);\n }\n\n if (subscriptions.size === 0) {\n this.#events.delete(eventType);\n }\n }\n\n /**\n * Clear all subscriptions.\n *\n * This will remove all subscribed handlers for all events registered from this messenger. Events\n * may still have subscribers if they are delegated to another messenger.\n */\n clearSubscriptions() {\n for (const eventType of this.#events.keys()) {\n this.clearEventSubscriptions(eventType);\n }\n }\n\n /**\n * Delegate actions and/or events to another messenger.\n *\n * The messenger these actions/events are delegated to will be able to call these actions and\n * subscribe to these events.\n *\n * Note that the messenger these actions/events are delegated to must still have these\n * actions/events included in its type definition (as part of the Action and Event type\n * parameters). Actions and events are statically type checked, they cannot be delegated\n * dynamically at runtime.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to delegate.\n * @param args.events - The event types to delegate.\n * @param args.messenger - The messenger to delegate to.\n * @template Delegatee - The messenger the actions/events are delegated to.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n delegate<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n for (const actionType of actions || []) {\n const delegatedActionHandler = (\n ...args: ExtractActionParameters<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n ) => {\n // Cast to get more specific type, for this specific action\n // The types get collapsed by `this.#actions`\n const actionHandler = this.#actions.get(actionType) as\n | ActionHandler<\n MessengerActions<Delegatee> & Action,\n typeof actionType\n >\n | undefined;\n if (!actionHandler) {\n throw new Error(\n `A handler for ${actionType} has not been registered`,\n );\n }\n return actionHandler(...args);\n };\n let delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets) {\n delegationTargets = new Set<DelegatedMessenger>();\n this.#actionDelegationTargets.set(actionType, delegationTargets);\n }\n if (delegationTargets.has(messenger)) {\n throw new Error(\n `The action '${actionType}' has already been delegated to this messenger`,\n );\n }\n delegationTargets.add(messenger);\n\n messenger._internalRegisterDelegatedActionHandler(\n actionType,\n delegatedActionHandler,\n );\n }\n for (const eventType of events || []) {\n const untypedSubscriber = (\n ...payload: ExtractEventPayload<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >\n ) => {\n messenger._internalPublishDelegated(eventType, ...payload);\n };\n // Cast to get more specific subscriber type for this specific event.\n // The types get collapsed here to the type union of all delegated\n // events, rather than the single subscriber type corresponding to this\n // event.\n const subscriber = untypedSubscriber as ExtractEventHandler<\n MessengerEvents<Delegatee> & Event,\n typeof eventType\n >;\n let delegatedEventSubscriptions =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegatedEventSubscriptions) {\n delegatedEventSubscriptions = new Map();\n this.#subscriptionDelegationTargets.set(\n eventType,\n delegatedEventSubscriptions,\n );\n }\n if (delegatedEventSubscriptions.has(messenger)) {\n throw new Error(\n `The event '${eventType}' has already been delegated to this messenger`,\n );\n }\n delegatedEventSubscriptions.set(messenger, subscriber);\n const getPayload = this.#initialEventPayloadGetters.get(eventType);\n if (getPayload) {\n messenger._internalRegisterDelegatedInitialEventPayload({\n eventType,\n getPayload,\n });\n }\n\n this.#subscribe(eventType, subscriber, { delegation: true });\n }\n }\n\n /**\n * Revoke delegated actions and/or events from another messenger.\n *\n * The messenger these actions/events are delegated to will no longer be able to call these\n * actions or subscribe to these events.\n *\n * @param args - Arguments.\n * @param args.actions - The action types to revoke.\n * @param args.events - The event types to revoke.\n * @param args.messenger - The messenger these actions/events were delegated to.\n * @template Delegatee - The messenger the actions/events are being revoked from.\n * @template DelegatedActions - An array of delegated action types.\n * @template DelegatedEvents - An array of delegated event types.\n */\n revoke<\n Delegatee extends Messenger<string, ActionConstraint, EventConstraint>,\n DelegatedActions extends (MessengerActions<Delegatee> & Action)['type'][],\n DelegatedEvents extends (MessengerEvents<Delegatee> & Event)['type'][],\n >({\n actions,\n events,\n messenger,\n }: {\n actions?: DelegatedActions;\n events?: DelegatedEvents;\n messenger: Delegatee;\n }) {\n if (messenger === this.#parent) {\n throw new Error('Cannot revoke from parent');\n }\n for (const actionType of actions || []) {\n const delegationTargets = this.#actionDelegationTargets.get(actionType);\n if (!delegationTargets || !delegationTargets.has(messenger)) {\n // Nothing to revoke\n continue;\n }\n messenger._internalUnregisterDelegatedActionHandler(actionType);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#actionDelegationTargets.delete(actionType);\n }\n }\n for (const eventType of events || []) {\n const delegationTargets =\n this.#subscriptionDelegationTargets.get(eventType);\n if (!delegationTargets) {\n // Nothing to revoke\n continue;\n }\n const delegatedSubscriber = delegationTargets.get(messenger);\n if (!delegatedSubscriber) {\n // Nothing to revoke\n continue;\n }\n this.unsubscribe(eventType, delegatedSubscriber);\n delegationTargets.delete(messenger);\n if (delegationTargets.size === 0) {\n this.#subscriptionDelegationTargets.delete(eventType);\n }\n }\n }\n\n /**\n * Register an action handler for an action delegated from another messenger.\n *\n * This will make the registered function available to call via the `call` method.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unique identifier for this action.\n * @param handler - The action handler. This function gets called when the `call` method is\n * invoked with the given action type.\n * @throws Will throw when a handler has been registered for this action type already.\n * @template ActionType - A type union of Action type strings.\n */\n _internalRegisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n // Using wider `ActionConstraint` type here rather than `Action` because the `Action` type is\n // contravariant over the handler parameter type. Using `Action` would lead to a type error\n // here because the messenger we've delegated to supports _additional_ actions.\n handler: ActionHandler<ActionConstraint, ActionType>,\n ) {\n this.#registerActionHandler(actionType, handler);\n }\n\n /**\n * Unregister an action handler for an action delegated from another messenger.\n *\n * This will prevent this action from being called.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param actionType - The action type. This is a unqiue identifier for this action.\n * @template ActionType - A type union of Action type strings.\n */\n _internalUnregisterDelegatedActionHandler<ActionType extends Action['type']>(\n actionType: ActionType,\n ) {\n this.#unregisterActionHandler(actionType);\n }\n\n /**\n * Register a function for getting the initial payload for an event that has been delegated from\n * another messenger.\n *\n * This is used for events that represent a state change, where the payload is the state.\n * Registering a function for getting the payload allows event selectors to have a point of\n * comparison the first time state changes.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param args - The arguments to this function\n * @param args.eventType - The event type to register a payload for.\n * @param args.getPayload - A function for retrieving the event payload.\n */\n _internalRegisterDelegatedInitialEventPayload<\n EventType extends Event['type'],\n >({\n eventType,\n getPayload,\n }: {\n eventType: EventType;\n getPayload: () => ExtractEventPayload<Event, EventType>;\n }) {\n this.#registerInitialEventPayload({ eventType, getPayload });\n }\n\n /**\n * Publish an event that was delegated from another messenger.\n *\n * Publishes the given payload to all subscribers of the given event type.\n *\n * Note that this method should never throw directly. Any errors from\n * subscribers are captured and re-thrown in a timeout handler.\n *\n * Note: This is an internal method. Never access this property from another module. This must be\n * exposed as a public property so that these methods can be called internally on other messenger\n * instances.\n *\n * @deprecated Internal use only. Use the `delegate` method for delegation.\n * @param eventType - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A type union of Event type strings.\n */\n _internalPublishDelegated<EventType extends Event['type']>(\n eventType: EventType,\n ...payload: ExtractEventPayload<Event, EventType>\n ) {\n this.#publish(eventType, ...payload);\n }\n\n /**\n * Determine whether the given name is within the current namespace.\n *\n * @param name - The name to check\n * @returns Whether the name is within the current namespace\n */\n #isInCurrentNamespace(name: string): name is NamespacedName<Namespace> {\n return name.startsWith(`${this.#namespace}:`);\n }\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Messenger =
|
|
3
|
+
exports.Messenger = void 0;
|
|
4
4
|
var Messenger_1 = require("./Messenger.cjs");
|
|
5
|
-
Object.defineProperty(exports, "MOCK_ANY_NAMESPACE", { enumerable: true, get: function () { return Messenger_1.MOCK_ANY_NAMESPACE; } });
|
|
6
5
|
Object.defineProperty(exports, "Messenger", { enumerable: true, get: function () { return Messenger_1.Messenger; } });
|
|
7
6
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAgBA,6CAAwC;AAA/B,sGAAA,SAAS,OAAA","sourcesContent":["export type {\n ActionHandler,\n ExtractActionParameters,\n ExtractActionResponse,\n ExtractEventHandler,\n ExtractEventPayload,\n GenericEventHandler,\n SelectorFunction,\n ActionConstraint,\n EventConstraint,\n MessengerActions,\n MessengerEvents,\n NamespacedBy,\n NotNamespacedBy,\n NamespacedName,\n} from './Messenger';\nexport { Messenger } from './Messenger';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { ActionHandler, ExtractActionParameters, ExtractActionResponse, ExtractEventHandler, ExtractEventPayload, GenericEventHandler, SelectorFunction, ActionConstraint, EventConstraint, MessengerActions, MessengerEvents,
|
|
2
|
-
export {
|
|
1
|
+
export type { ActionHandler, ExtractActionParameters, ExtractActionResponse, ExtractEventHandler, ExtractEventPayload, GenericEventHandler, SelectorFunction, ActionConstraint, EventConstraint, MessengerActions, MessengerEvents, NamespacedBy, NotNamespacedBy, NamespacedName, } from "./Messenger.cjs";
|
|
2
|
+
export { Messenger } from "./Messenger.cjs";
|
|
3
3
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,GACf,wBAAoB;AACrB,OAAO,EAAE,SAAS,EAAE,wBAAoB"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { ActionHandler, ExtractActionParameters, ExtractActionResponse, ExtractEventHandler, ExtractEventPayload, GenericEventHandler, SelectorFunction, ActionConstraint, EventConstraint, MessengerActions, MessengerEvents,
|
|
2
|
-
export {
|
|
1
|
+
export type { ActionHandler, ExtractActionParameters, ExtractActionResponse, ExtractEventHandler, ExtractEventPayload, GenericEventHandler, SelectorFunction, ActionConstraint, EventConstraint, MessengerActions, MessengerEvents, NamespacedBy, NotNamespacedBy, NamespacedName, } from "./Messenger.mjs";
|
|
2
|
+
export { Messenger } from "./Messenger.mjs";
|
|
3
3
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,GACf,wBAAoB;AACrB,OAAO,EAAE,SAAS,EAAE,wBAAoB"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { Messenger } from "./Messenger.mjs";
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,wBAAoB","sourcesContent":["export type {\n ActionHandler,\n ExtractActionParameters,\n ExtractActionResponse,\n ExtractEventHandler,\n ExtractEventPayload,\n GenericEventHandler,\n SelectorFunction,\n ActionConstraint,\n EventConstraint,\n MessengerActions,\n MessengerEvents,\n NamespacedBy,\n NotNamespacedBy,\n NamespacedName,\n} from './Messenger';\nexport { Messenger } from './Messenger';\n"]}
|