passes around unnecessary instance of Unit
There is only one instance of the
Unit
object, so don't worry about this.
on callside uses tryEmit
even though it is bound to success
That sounds OK to me. The client doesn't know the backpressure strategy of that flow, so it makes sense IMO that the client expresses whether it is able to handle backpressure via suspension or whether it wants to just keep going (you could use emit if you're already in a suspending context, it won't suspend anyway). On the other side, the construction of the flow decides what to do for backpressure on its own.
it uses a unnecessary buffer of 1
Why do you consider it unnecessary? It allows slow subscribers to run multiple times in a row if one or more new notifications arrived while they were processing the previous one, it makes sense to have this buffer. You need somehow to store the "boolean state" you're referring to ("was there a notification since I last run?").
has quite complicated configuration in the constructor for such a simple and common usage.
It's true it could maybe be included in the coroutines library, but you could also define a simple wrapper around this yourself.