ConnectableSubscriber

final class ConnectableSubscriber[-A] extends Subscriber[A]

Wraps a Subscriber into an implementation that abstains from emitting items until the call to connect() happens. Prior to connect() you can enqueue events for delivery once connect() happens, but before any items emitted by onNext / onComplete and onError.

Example:

 import monix.execution.Ack.Continue
 import monix.execution.Scheduler.Implicits.global

 val subscriber = new Subscriber[String] {
   val scheduler = global
   def onNext(a: String) = {
     println(s"Received: $$a")
     Continue
   }
   def onError(e: Throwable) =
     println(s"Error: $$e")
   def onComplete() =
     println("Completed!")
 }

 val out = ConnectableSubscriber(subscriber)

 // schedule onNext event, after connect()
 out.onNext("c")

 // schedule event "a" to be emitted first
 out.pushFirst("a")
 // schedule event "b" to be emitted second
 out.pushFirst("b")

 // underlying observer now gets events "a", "b", "c" in order
 out.connect()

Example of an observer ended in error:

 val out2 = ConnectableSubscriber(subscriber)

 // schedule onNext event, after connect()
 out2.onNext("c")

 out2.pushFirst("a") // event "a" to be emitted first
 out2.pushFirst("b") // event "b" to be emitted second

 // schedule an onError sent downstream, once connect()
 // happens, but after "a" and "b"
 out2.pushError(new RuntimeException())

 // underlying observer receives ...
 // onNext("a") -> onNext("b") -> onError(RuntimeException)
 out2.connect()

 // NOTE: that onNext("c") never happens
Companion:
object
trait Subscriber[A]
trait Observer[A]
trait Serializable
class Object
trait Matchable
class Any

Value members

Concrete methods

def connect(): CancelableFuture[Ack]

Connects the underling observer to the upstream publisher.

Connects the underling observer to the upstream publisher.

This function should be idempotent. Calling it multiple times should have the same effect as calling it once.

The Subscriber.onComplete method that pushes the complete event to the underlying observer.

The Subscriber.onComplete method that pushes the complete event to the underlying observer.

It will wait for connect to happen and the queue of scheduled events to be drained.

The Subscriber.onError method that pushes an error event to the underlying observer.

The Subscriber.onError method that pushes an error event to the underlying observer.

It will wait for connect to happen and the queue of scheduled events to be drained.

def onNext(elem: A): Future[Ack]

The Subscriber.onNext method that pushes events to the underlying subscriber.

The Subscriber.onNext method that pushes events to the underlying subscriber.

It will back-pressure by means of its Future[Ack] result until connect happens and the underlying queue of scheduled events have been drained.

Schedule a complete event when connect happens, but before any elements scheduled with pushFirst or pushFirstAll.

Schedule a complete event when connect happens, but before any elements scheduled with pushFirst or pushFirstAll.

After pushComplete no more pushFirst or onNext events are accepted.

Schedule an error event when connect happens, but before any elements scheduled with pushFirst or pushFirstAll.

Schedule an error event when connect happens, but before any elements scheduled with pushFirst or pushFirstAll.

After pushError no more pushFirst or onNext events are accepted.

def pushFirst(elem: A): Unit

Schedule one element to be pushed to the underlying subscriber when connect happens.

Schedule one element to be pushed to the underlying subscriber when connect happens.

The given elements are appended to a queue that will be drained on connect. Afterwards no more elements are allowed to be pushed in the queue.

These elements are streamed before any elements that will eventually get streamed with onNext, because of the applied back-pressure from onNext.

def pushFirstAll[U <: A](xs: Iterable[U]): Unit

Schedule elements to be pushed to the underlying subscriber when connect happens.

Schedule elements to be pushed to the underlying subscriber when connect happens.

The given elements are appended to a queue that will be drained on connect. Afterwards no more elements are allowed to be pushed in the queue.

These elements are streamed before any elements that will eventually get streamed with onNext, because of the applied back-pressure from onNext.

Implicits

Implicits

implicit val scheduler: Scheduler