Beispiel #1
0
        public async Task WriteCheckpoint(Flow flow)
        {
            var result = await _context.Connection.AppendToStreamAsync(
                flow.Context.Key.GetCheckpointStream(),
                ExpectedVersion.Any,
                _context.GetCheckpointEventData(flow));

            if (flow is Query query)
            {
                try
                {
                    var checkpoint = new TimelinePosition(result.NextExpectedVersion);
                    var etag       = QueryETag.From(query.Context.Key, checkpoint).ToString();

                    await _context.Connection.AppendToStreamAsync(
                        TimelineStreams.ChangedQueries,
                        ExpectedVersion.Any,
                        _context.GetQueryChangedEventData(new QueryChanged(etag)));
                }
                catch (Exception error)
                {
                    Log.Error(error, "Failed to write QueryChanged for {Query} - subscribers will not be aware of the change until the query observes another event.", query);
                }
            }
        }
Beispiel #2
0
        internal async Task <TQuery> Get <TQuery>(Id id) where TQuery : Query
        {
            var key = GetKey <TQuery>(id);

            var state = await _queryDb.ReadState(QueryETag.From(key));

            return((TQuery)Deserialize(key.Type, state.ReadContent()));
        }
Beispiel #3
0
        QueryETag ReadETag(Type type, Id id)
        {
            if (TryGetIfNoneMatch(out var ifNoneMatch))
            {
                return(QueryETag.From(ifNoneMatch, _area));
            }

            var key = FlowKey.From(_area.Queries.Get(type), id);

            return(QueryETag.From(key, TimelinePosition.None));
        }
Beispiel #4
0
        async Task TryWriteQueryStopped(Flow flow)
        {
            try
            {
                var etag = QueryETag.From(flow.Context.Key, flow.Context.CheckpointPosition).ToString();

                await _context.AppendToClient(new QueryStopped(etag, flow.Context.ErrorMessage));
            }
            catch (Exception error)
            {
                Log.Error(error, "Failed to write stoppage of query {Query} to the client stream. Subscribers will not be aware of the failure", flow);
            }
        }
Beispiel #5
0
        async Task TryWriteQueryChanged(Flow query)
        {
            try
            {
                var etag = QueryETag.From(query.Context.Key, query.Context.CheckpointPosition).ToString();

                await _context.AppendToClient(new QueryChanged(etag));
            }
            catch (Exception error)
            {
                Log.Error(error, "Failed to write update of query {Query} to the client stream. Subscribers will not be aware of the change until the query observes another event.", query);
            }
        }
Beispiel #6
0
        async Task <Stream> AppendAndWaitUntilChanged(FlowKey key, Event e, TestTimeline timeline)
        {
            var connectionId = Id.FromGuid();

            await _queryDb.SubscribeToChanged(connectionId, QueryETag.From(key));

            var position = await timeline.Append(e);

            var newETag = QueryETag.From(key, position);

            await _notifier.WaitUntilChanged(connectionId, newETag);

            _queryDb.UnsubscribeFromChanged(connectionId);

            return(await _queryDb.ReadContent(newETag));
        }
Beispiel #7
0
 public Task SubscribeToChanged(string etag) =>
 _db.SubscribeToChanged(ConnectionId, QueryETag.From(etag, _area));
Beispiel #8
0
 QueryETag ETagFrom(string etag) =>
 QueryETag.From(etag, _context.Area);
Beispiel #9
0
 void OnChanged(ResolvedEvent e) =>
 _db.OnChanged(QueryETag.From(
                   _context.Json.FromJsonUtf8 <QueryChanged>(e.Event.Data).ETag,
                   _context.Area));