public void Subscribe(ISubscriber <T> subscriber) { ReactiveStreamsCompliance.RequireNonNullSubscriber(subscriber); SubscriptionTimeout.Cancel(); if (_state.CompareAndSet(Open.Instance, new Attached(subscriber))) { Actor.Tell(new SubstreamSubscribe(Key, subscriber)); } else { var value = _state.Value; if (value is Attached || value is Cancelled) { ReactiveStreamsCompliance.RejectAdditionalSubscriber(subscriber, "Substream publisher"); } else if (value is ICompletedState) { ReactiveStreamsCompliance.TryOnSubscribe(subscriber, CancelledSubscription.Instance); CloseSubscriber(subscriber, (ICompletedState)value); } else if (value is Open) { throw new IllegalStateException("Publisher cannot become open after being used before"); } } }
/// <summary> /// TBD /// </summary> /// <param name="subscriber">TBD</param> public void Subscribe(ISubscriber <T> subscriber) { ReactiveStreamsCompliance.RequireNonNullSubscriber(subscriber); ReactiveStreamsCompliance.TryOnSubscribe(subscriber, new MaybeSubscription(subscriber, Promise)); Promise.Task.ContinueWith(t => { ReactiveStreamsCompliance.TryOnError(subscriber, t.Exception); }, TaskContinuationOptions.NotOnRanToCompletion); }
public void AttachSubscriber(ISubscriber <T> subscriber) { if (Subscriber == null) { Subscriber = UntypedSubscriber.FromTyped(subscriber); ReactiveStreamsCompliance.TryOnSubscribe(subscriber, _subscription); } else { ReactiveStreamsCompliance.RejectAdditionalSubscriber(subscriber, "Substream publisher"); } }
private void SubscribePending(IEnumerable <IUntypedSubscriber> subscribers) { foreach (var subscriber in subscribers) { if (ReferenceEquals(Subscriber, null)) { Subscriber = subscriber; ReactiveStreamsCompliance.TryOnSubscribe(subscriber, CreateSubscription()); } else { ReactiveStreamsCompliance.RejectAdditionalSubscriber(subscriber, GetType().Name); } } }
/// <summary> /// TBD /// </summary> /// <param name="subscriber">TBD</param> public void Subscribe(ISubscriber <T> subscriber) { try { ReactiveStreamsCompliance.RequireNonNullSubscriber(subscriber); ReactiveStreamsCompliance.TryOnSubscribe(subscriber, CancelledSubscription.Instance); ReactiveStreamsCompliance.TryOnError(subscriber, Cause); } catch (Exception e) { if (!(e is ISpecViolation)) { throw; } } }
public void Subscribe(ISubscriber <T> subscriber) { try { ReactiveStreamsCompliance.RequireNonNullSubscriber(subscriber); ReactiveStreamsCompliance.TryOnSubscribe(subscriber, new MaybeSubscription(subscriber, Promise)); Promise.Task.ContinueWith(t => { ReactiveStreamsCompliance.TryOnError(subscriber, t.Exception); }, TaskContinuationOptions.NotOnRanToCompletion); } catch (Exception) { //case sv: SpecViolation ⇒ ec.reportFailure(sv) throw; } }
private void ClosePublisher(ICompletedState withState) { SubscriptionTimeout.Cancel(); var prev = _state.Value; _state.Value = withState; if (prev is ICompletedState) { throw new IllegalStateException("Attempted to double shutdown publisher"); } if (prev is Attached) { var sub = ((Attached)prev).Subscriber; if (Subscriber == null) { ReactiveStreamsCompliance.TryOnSubscribe(sub, CancelledSubscription.Instance); } CloseSubscriber(sub, withState); } }