public async Task ProjectAsync(IStreamEvents streamEvents, CancellationToken ct) { var projection = GetType(); var projectionOffset = await _offsetTracker.GetOffsetAsync(projection); try { await streamEvents.SubscribeAsync( projection, projectionOffset, ct, async data => await TrackAndHandleEventAsync(projection, data)); } catch (OperationCanceledException) { throw; } catch (Exception e) { throw new ApertureProjectionException( "Exception encountered while projecting events, see inner exception for more details", e); } }