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); } } }
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())); }
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)); }
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); } }
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); } }
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)); }
public Task SubscribeToChanged(string etag) => _db.SubscribeToChanged(ConnectionId, QueryETag.From(etag, _area));
QueryETag ETagFrom(string etag) => QueryETag.From(etag, _context.Area);
void OnChanged(ResolvedEvent e) => _db.OnChanged(QueryETag.From( _context.Json.FromJsonUtf8 <QueryChanged>(e.Event.Data).ETag, _context.Area));