public void Handle(ClientMessage.SubscribeToStream msg) { var streamAccess = _readIndex.CheckStreamAccess( msg.EventStreamId.IsEmptyString() ? SystemStreams.AllStream : msg.EventStreamId, StreamAccessType.Read, msg.User); if (streamAccess.Granted) { var lastEventNumber = msg.EventStreamId.IsEmptyString() ? (long?)null : _readIndex.GetStreamLastEventNumber(msg.EventStreamId); var lastIndexedPos = _readIndex.LastIndexedPosition; SubscribeToStream(msg.CorrelationId, msg.Envelope, msg.ConnectionId, msg.EventStreamId, msg.ResolveLinkTos, lastIndexedPos, lastEventNumber, EventFilter.None); var subscribedMessage = new ClientMessage.SubscriptionConfirmation(msg.CorrelationId, lastIndexedPos, lastEventNumber); msg.Envelope.ReplyWith(subscribedMessage); } else { msg.Envelope.ReplyWith( new ClientMessage.SubscriptionDropped(msg.CorrelationId, SubscriptionDropReason.AccessDenied)); } }
public void CreateSubscription() { var subscribeMsg = new ClientMessage.SubscribeToStream(Guid.NewGuid(), Guid.NewGuid(), new CallbackEnvelope(x => { switch (x.GetType().Name) { case "SubscriptionConfirmation": SubscriptionsConfirmed.Signal(); break; case "StreamEventAppeared": EventAppeared.Signal(); break; case "SubscriptionDropped": break; default: Assert.Fail("Unexpected message type :" + x.GetType().Name); break; } }), Guid.NewGuid(), StreamId, false, SystemAccount.Principal); Node.Node.MainQueue.Publish(subscribeMsg); }
protected override TcpPackage CreateSubscriptionPackage() { var dto = new ClientMessage.SubscribeToStream(_streamId, _resolveLinkTos); return(new TcpPackage( TcpCommand.SubscribeToStream, _userCredentials != null ? TcpFlags.Authenticated : TcpFlags.None, _correlationId, _userCredentials != null ? _userCredentials.Username : null, _userCredentials != null ? _userCredentials.Password : null, dto.Serialize())); }
public void Handle(ClientMessage.SubscribeToStream message) { List <Tuple <Guid, TcpConnectionManager> > subscribers; if (!_subscriptions.TryGetValue(message.EventStreamId, out subscribers)) { subscribers = new List <Tuple <Guid, TcpConnectionManager> >(); _subscriptions.Add(message.EventStreamId, subscribers); } subscribers.Add(Tuple.Create(message.CorrelationId, message.Connection)); }
public void Handle(ClientMessage.SubscribeToStream msg) { var lastEventNumber = msg.EventStreamId.IsEmptyString() ? (long?)null : _readIndex.GetStreamLastEventNumber(msg.EventStreamId); var lastIndexedPos = _readIndex.LastIndexedPosition; SubscribeToStream(msg.CorrelationId, msg.Envelope, msg.ConnectionId, msg.EventStreamId, msg.ResolveLinkTos, lastIndexedPos, lastEventNumber, EventFilter.None); var subscribedMessage = new ClientMessage.SubscriptionConfirmation(msg.CorrelationId, lastIndexedPos, lastEventNumber); msg.Envelope.ReplyWith(subscribedMessage); }
public Task Subscribe(string stream, Action <RecordedEvent, Position> eventAppeared, Action subscriptionDropped) { var id = Guid.NewGuid(); var source = new TaskCompletionSource <object>(); if (_subscriptions.TryAdd(id, new Subscription(source, id, stream, eventAppeared, subscriptionDropped))) { var subscribe = new ClientMessage.SubscribeToStream(stream); var pkg = new TcpPackage(TcpCommand.SubscribeToStream, id, subscribe.Serialize()); _connection.EnqueueSend(pkg.AsByteArray()); } else { source.SetException(new Exception("Failed to add subscription. Concurrency failure.")); } return(source.Task); }