Skip to content

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

License

Notifications You must be signed in to change notification settings

Kotlin-Android-Open-Source/kotlin-channel-event-bus

 
 

Repository files navigation

kotlin-channel-event-bus 🔆

Build and publish snapshot

Kotlin version KotlinX Coroutines version

Hits

badge badge badge badge badge badge badge

TODO - TBD - WIP

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

  • A Kotlin Multiplatform library that provides a simple event bus implementation using kotlinx.coroutines.channels.Channels. This is useful for UI applications where you want to send events to communicate between different parts / scope of your application.

  • 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.

Liked some of my work? Buy me a coffee (or more likely a beer)

Buy Me A Coffee

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) // or bus.receiveAsFlow(AwesomeEvent.Key) if you want to be explicit
  .collect { e: AwesomeEvent -> println(e) }

Supported targets

  • jvm / android.
  • js (IR).
  • Darwin targets:
    • iosArm64, iosArm32, iosX64, iosSimulatorArm64.
    • watchosArm32, watchosArm64, watchosX64, watchosX86, watchosSimulatorArm64.
    • tvosX64, tvosSimulatorArm64, tvosArm64.
    • macosX64, macosArm64.

Docs

TODO - TBD - WIP

Sample

  • Android Compose sample: an Android app using Compose UI to show how to use the library. It has two nested navigation graphs: RegisterScreen and HomeScreen.

    In RegisterScreen, we have 3 steps (3 screens) to allow user to input their information, step by step.

    • A RegisterSharedViewModel (bound to RegisterScreen navigation graph scope) is used to hold the whole state of the registration process. It observes events from the ChannelEventBus and update the state accordingly.

    • Each step screen has a ViewModel to hold the state of the screen, and will send events to the ChannelEventBus, then the RegisterSharedViewModel will receive those events and update the state.

Roadmap

TODO - TBD - WIP

License

TODO - TBD - WIP

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 99.1%
  • Shell 0.9%