import {Awaitable, Rehydratable} from '../util' import {Instantiable, StaticClass} from '../di' /** * A closure that should be executed with the given event is fired. */ export type EventSubscriber = (event: T) => Awaitable /** * An object used to track event subscriptions internally. */ export interface EventSubscriberEntry { /** Globally unique ID of this subscription. */ id: string /** The event class subscribed to. */ event: StaticClass> /** The closure to execute when the event is fired. */ subscriber: EventSubscriber } /** * An object returned upon subscription, used to unsubscribe. */ export interface EventSubscription { /** * Unsubscribe the associated listener from the event bus. */ unsubscribe(): Awaitable } /** * An instance of something that can be fired on an event bus. */ export interface Dispatchable extends Rehydratable { shouldQueue?: boolean } /** * An event-driven bus that manages subscribers and dispatched items. */ export interface Bus { subscribe(eventClass: StaticClass>, subscriber: EventSubscriber): Awaitable unsubscribe(subscriber: EventSubscriber): Awaitable dispatch(event: Dispatchable): Awaitable }