Search code examples
.netstreamevent-sourcingeventstoredbevent-store

Read stream from EventStore without "stream doesn't exist exception"


Application written in .net tries to read event stream. For this goal, EventStoreCleint wrapper was written, under the hood it uses EventStore.Client.Grpc.Streams 23.1.0. The logic is the following:

  • try to read stream
  • if there is no stream (or stream version is 0) we can continue and send TenantCreated event
  • if there is a stream (or stream version is > 0) application will not apply TenantCreated event.

The problem is in fact, when the application reads the event stream by _client.ReadStreamAsync if there is no stream, the exception will be thrown. Exceptions are expensive from the performance point of view.

How to read stream even is stream version is 0 without exceptions?


Solution

  • If you inspect the StreamState in the result, it will be StreamNotFound

    var res = await conn.ReadStreamAsync(Direction.Forwards, streamName, startPosition, Int64.MaxValue, resolveLinkTos: false, cancellationToken: ct)
    if (res.ReadState == ReadState.StreamNotFound)
       // TODO handle empty
    

    Example in Equinox

    When writing, ConditionalAppendToStreamAsync don't throw an exception either; you inspect the Status of the result.

    Example in Equinox