internal async Task OnStopped(QueryETag etag, string error) { if (_instancesByKey.TryGetValue(etag.Key, out var instance)) { await _notifier.NotifyStopped(etag, error, instance.ConnectionIds); } _changedWindow.OnChanged(etag); }
internal void OnChanged(QueryETag etag) { var now = Clock.Now; _queriesByKey[etag.Key] = new QueryWindow(etag, now); if (now - _whenTrimmed > _trimDelay) { TrimQueries(now); } }
public static Task <QueryContent> ReadQueryContent(this IQueryDb db, string etag, Type type, Id id) => db.ReadQueryContent(area => { if (!string.IsNullOrWhiteSpace(etag)) { return(QueryETag.From(etag, area)); } var key = FlowKey.From(area.Queries[type], id); return(QueryETag.From(key, TimelinePosition.None)); });
public async Task SubscribeToChanged(Id connectionId, QueryETag etag) { var connection = _connectionsById.GetOrAdd(connectionId, _ => new QueryConnection(connectionId, this)); var instance = _instancesByKey.GetOrAdd(etag.Key, _ => new QueryInstance(etag.Key, this)); connection.Subscribe(instance); var latestETag = _changedWindow.OnSubscribed(etag); if (latestETag != etag) { await _notifier.NotifyChanged(latestETag, Many.Of(connectionId)); } }
public QueryContent(QueryETag etag, Stream content) { ETag = etag; _data = content; }
public QueryContent(QueryETag etag) { ETag = etag; NotModified = true; }
public Task OnQueryStopped(QueryETag query, string error) => _queries.OnStopped(query, error);
public Task OnQueryChanged(QueryETag query) => _queries.OnChanged(query);
public QueryState(QueryETag etag, Stream content) { ETag = etag; _content = content; }
public QueryState(QueryETag etag) { ETag = etag; NotModified = true; }
internal QueryETag GetLatest(QueryETag etag) => _etag.GetLatest(etag);
internal QueryWindow(QueryETag etag, DateTimeOffset whenChanged) { _etag = etag; _whenChanged = whenChanged; }
internal QueryETag OnSubscribed(QueryETag etag) => _queriesByKey .GetOrAdd(etag.Key, _ => new QueryWindow(etag, Clock.Now)) .GetLatest(etag);