public override async Task <CreateResp> Create(CreateReq request, ServerCallContext context) { var createPersistentSubscriptionSource = new TaskCompletionSource <CreateResp>(); var settings = request.Options.Settings; var correlationId = Guid.NewGuid(); var user = context.GetHttpContext().User; if (!await _authorizationProvider.CheckAccessAsync(user, CreateOperation, context.CancellationToken).ConfigureAwait(false)) { throw AccessDenied(); } string streamId = null; switch (request.Options.StreamOptionCase) { case StreamOptionOneofCase.Stream: case StreamOptionOneofCase.None: /*for backwards compatibility*/ { StreamRevision startRevision; if (request.Options.StreamOptionCase == StreamOptionOneofCase.Stream) { streamId = request.Options.Stream.StreamIdentifier; startRevision = request.Options.Stream.RevisionOptionCase switch { RevisionOptionOneofCase.Revision => new StreamRevision(request.Options.Stream.Revision), RevisionOptionOneofCase.Start => StreamRevision.Start, RevisionOptionOneofCase.End => StreamRevision.End, _ => throw new InvalidOperationException() }; } else /*for backwards compatibility*/ { #pragma warning disable 612 streamId = request.Options.StreamIdentifier; startRevision = new StreamRevision(request.Options.Settings.Revision); #pragma warning restore 612 } _publisher.Publish( new ClientMessage.CreatePersistentSubscriptionToStream( correlationId, correlationId, new CallbackEnvelope(HandleCreatePersistentSubscriptionCompleted), streamId, request.Options.GroupName, settings.ResolveLinks, startRevision.ToInt64(), settings.MessageTimeoutCase switch { CreateReq.Types.Settings.MessageTimeoutOneofCase.MessageTimeoutMs => settings .MessageTimeoutMs, CreateReq.Types.Settings.MessageTimeoutOneofCase.MessageTimeoutTicks => (int)TimeSpan .FromTicks(settings.MessageTimeoutTicks).TotalMilliseconds, _ => 0 }, settings.ExtraStatistics, settings.MaxRetryCount, settings.HistoryBufferSize, settings.LiveBufferSize, settings.ReadBatchSize, settings.CheckpointAfterCase switch { CreateReq.Types.Settings.CheckpointAfterOneofCase.CheckpointAfterMs => settings .CheckpointAfterMs, CreateReq.Types.Settings.CheckpointAfterOneofCase.CheckpointAfterTicks => (int)TimeSpan .FromTicks(settings.CheckpointAfterTicks).TotalMilliseconds, _ => 0 },