Пример #1
0
        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
                    },