class BufferUntilReady(source: Observable) { @Volatile private var ready = false private val cache = LinkedList() private val subscription = source.takeWhile { !ready }.subscribe { cache += it } private val merged = Observable.merge(Observable.from(cache).doOnCompleted { cache.clear() }, source) val buffered = merged.doOnSubscribe { ready = true } } fun Observable.bufferUntilSubscribed(): Observable = BufferUntilReady(this).buffered