package com.netflix.eventbus.rx; import javax.inject.Inject; import javax.inject.Singleton; import com.netflix.eventbus.spi.DynamicSubscriber; import com.netflix.eventbus.spi.EventBus; import com.netflix.eventbus.spi.EventCreator; import com.netflix.eventbus.spi.EventFilter; import com.netflix.eventbus.spi.InvalidSubscriberException; import com.netflix.eventbus.spi.Subscribe; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; import rx.functions.Action0; import rx.subscriptions.BooleanSubscription; /** * Small wrapper on top of the EventBus to allow consumption of events as * Rx streams. * * @author elandau * */ @Singleton public class RxEventBus { private final EventBus eventBus; @Inject public RxEventBus(EventBus eventBus) { this.eventBus = eventBus; } /** * {@link EventBus.publish} */ public void publish(Object event) { eventBus.publish(event); } /** * {@link EventBus.publishIfNotDead} */ public void publishIfNotDead(EventCreator creator, Class<?>... eventTypes) { eventBus.publishIffNotDead(creator, eventTypes); } /** * Create an observable for this eventType. A new event bus subscription * is made for each call to the Observables.subscribe(). The subscription * is removed from the underlying EventBus when unsubscribe is called. * * @param eventType * @return */ public <T> Observable<T> asObservable(final Class<T> eventType) { return Observable.create(new OnSubscribe<T>() { @Override public void call(final Subscriber<? super T> observer) { final DynamicSubscriber consumer = new DynamicSubscriber() { @Override public Class<?> getEventType() { return eventType; } @Subscribe public void consume(Object obj) { observer.onNext((T) obj); } }; observer.add(BooleanSubscription.create(new Action0() { @Override public void call() { eventBus.unregisterSubscriber(consumer); observer.onCompleted(); } })); try { eventBus.registerSubscriber(consumer); } catch (InvalidSubscriberException e) { observer.onError(e); } } }); } /** * Create an observable for this eventType using a filter. A new event bus * subscription is made for each call to the Observables.subscribe(). The * subscription is removed from the underlying EventBus when unsubscribe is * called. * * @param eventType * @return */ public <T> Observable<T> asObservable(final Class<T> eventType, final EventFilter filter) { return Observable.create(new OnSubscribe<T>() { @Override public void call(final Subscriber<? super T> observer) { final DynamicSubscriber consumer = new DynamicSubscriber() { @Override public Class<?> getEventType() { return eventType; } @Subscribe public void consume(Object obj) { observer.onNext((T) obj); } }; observer.add(BooleanSubscription.create(new Action0() { @Override public void call() { eventBus.unregisterSubscriber(consumer); observer.onCompleted(); } })); try { eventBus.registerSubscriber(filter, consumer); } catch (InvalidSubscriberException e) { observer.onError(e); } } }); } }