protected async Task Handler(ReceivedEvent re, CancellationToken cancellationToken) { _debugLog?.Invoke( "Subscription {Subscription} got an event {EventType}", SubscriptionId, re.EventType ); _lastProcessed = GetPosition(re); if (re.EventType.StartsWith("$") || re.Data.IsEmpty) { await Store(); return; } try { var contentType = string.IsNullOrWhiteSpace(re.ContentType) ? "application/json" : re.ContentType; if (contentType != _eventSerializer.ContentType) { throw new InvalidOperationException($"Unknown content type {contentType}"); } object?evt; try { evt = _eventSerializer.Deserialize(re.Data.Span, re.EventType); } catch (Exception e) { _log?.LogError( e, "Error deserializing event {Strean} {Position} {Type}", re.OriginalStream, re.StreamPosition, re.EventType ); throw; } if (evt != null) { await Task.WhenAll( _eventHandlers.Select(x => x.HandleEvent(evt, (long?)re.GlobalPosition, cancellationToken)) ); } } catch (Exception e) { _log?.LogWarning( e, "Error when handling the event {Strean} {Position} {Type}", re.OriginalStream, re.StreamPosition, re.EventType ); } await Store(); Task Store() => StoreCheckpoint(GetPosition(re), cancellationToken);
static EventPosition GetPosition(ReceivedEvent receivedEvent) => new(receivedEvent.StreamPosition, receivedEvent.Created);