ChannelEventBus

sealed interface ChannelEventBus

Multi-keys, multi-producers, single-consumer event bus backed by Channels.

  • This bus is thread-safe to be used by multiple threads. It is safe to send events from multiple threads without any synchronization.

  • ChannelEvent.Key will be used to identify a bus for a specific type of events. Each bus has a Channel to send events to and a Flow to receive events from.

  • The Channel is unbounded Channel.UNLIMITED (default) or conflated Channel.CONFLATED. The Flow is cold and only one collector is allowed at a time. This make sure all events are consumed.

Basic usage:

// Create your event type
data class AwesomeEvent(val payload: Int) : ChannelEvent<AwesomeEvent> {
override val key get() = Key
companion object Key : ChannelEventKey<AwesomeEvent>(AwesomeEvent::class)
}

// Create your bus instance
val bus = ChannelEventBus()

// Send events to the bus
bus.send(AwesomeEvent(1))
bus.send(AwesomeEvent(2))
bus.send(AwesomeEvent(3))

// Receive events from the bus
bus.receiveAsFlow(AwesomeEvent)
.collect { e: AwesomeEvent -> println(e) }

Functions

Link copied to clipboard
abstract fun close()

Close all buses without any validation.

Link copied to clipboard
abstract fun closeKey(key: ChannelEventKey<*>, validations: Set<ValidationBeforeClosing> = ValidationBeforeClosing.ALL)

Close the bus identified by key.

Link copied to clipboard
abstract fun <T : ChannelEvent<T>> receiveAsFlow(key: ChannelEventKey<T>): Flow<T>

Receive events from the bus identified by ChannelEvent.key.

Link copied to clipboard
abstract fun <E : ChannelEvent<E>> send(event: E, option: OptionWhenSendingToBusDoesNotExist = CREATE_NEW_BUS)

Send event to the bus identified by ChannelEvent.key.