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"); } } }
public void AttachSubscriber(ISubscriber <T> subscriber) { if (Subscriber == null) { Subscriber = UntypedSubscriber.FromTyped(subscriber); ReactiveStreamsCompliance.TryOnSubscribe(subscriber, _subscription); } else { ReactiveStreamsCompliance.RejectAdditionalSubscriber(subscriber, "Substream publisher"); } }
/// <summary> /// TBD /// </summary> /// <param name="subscriber">TBD</param> public void Subscribe(ISubscriber <T> subscriber) { try { ReactiveStreamsCompliance.RejectAdditionalSubscriber(subscriber, "Publisher"); } catch (Exception e) { if (!(e is ISpecViolation)) { throw; } } }
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); } } }