You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.3 KiB
48 lines
1.3 KiB
3 years ago
|
import {Awaitable, Rehydratable} from '../util'
|
||
|
import {StaticClass} from '../di'
|
||
|
|
||
|
/**
|
||
|
* A closure that should be executed with the given event is fired.
|
||
|
*/
|
||
|
export type EventSubscriber<T extends Dispatchable> = (event: T) => Awaitable<void>
|
||
|
|
||
|
/**
|
||
|
* An object used to track event subscriptions internally.
|
||
|
*/
|
||
|
export interface EventSubscriberEntry<T extends Dispatchable> {
|
||
|
/** Globally unique ID of this subscription. */
|
||
|
id: string
|
||
|
|
||
|
/** The event class subscribed to. */
|
||
|
event: StaticClass<T, T>
|
||
|
|
||
|
/** The closure to execute when the event is fired. */
|
||
|
subscriber: EventSubscriber<T>
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* An object returned upon subscription, used to unsubscribe.
|
||
|
*/
|
||
|
export interface EventSubscription {
|
||
|
/**
|
||
|
* Unsubscribe the associated listener from the event bus.
|
||
|
*/
|
||
|
unsubscribe(): Awaitable<void>
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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<T extends Dispatchable>(eventClass: StaticClass<T, T>, subscriber: EventSubscriber<T>): Awaitable<EventSubscription>
|
||
|
unsubscribe<T extends Dispatchable>(subscriber: EventSubscriber<T>): Awaitable<void>
|
||
|
dispatch(event: Dispatchable): Awaitable<void>
|
||
|
}
|