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.
29 lines
991 B
29 lines
991 B
import {EventBus} from './EventBus'
|
|
import {Collection} from '../util'
|
|
import {Bus, Dispatchable} from './types'
|
|
|
|
/**
|
|
* A non-queued bus implementation that executes subscribers immediately in the main thread.
|
|
* This bus also supports "propagating" events along to any other connected buses.
|
|
* Such behavior is useful, e.g., if we want to have a semi-isolated request-
|
|
* level bus whose events still reach the global EventBus instance.
|
|
*/
|
|
export class PropagatingEventBus extends EventBus {
|
|
protected recipients: Collection<Bus> = new Collection<Bus>()
|
|
|
|
async dispatch(event: Dispatchable): Promise<void> {
|
|
await super.dispatch(event)
|
|
await this.recipients.promiseMap(bus => bus.dispatch(event))
|
|
}
|
|
|
|
/**
|
|
* Register the given bus to receive events fired on this bus.
|
|
* @param recipient
|
|
*/
|
|
connect(recipient: Bus): void {
|
|
if ( !this.recipients.includes(recipient) ) {
|
|
this.recipients.push(recipient)
|
|
}
|
|
}
|
|
}
|