Пример #1
0
        private async Task SendResultsAsync()
        {
            try
            {
                await foreach (IReadOnlyQueryResult result in
                               _responseStream.WithCancellation(_cts.Token))
                {
                    await _connection.SendAsync(
                        new DataResultMessage(Id, result).Serialize(),
                        _cts.Token)
                    .ConfigureAwait(false);
                }


                if (!_cts.IsCancellationRequested)
                {
                    await _connection.SendAsync(
                        new DataCompleteMessage(Id).Serialize(),
                        _cts.Token).ConfigureAwait(false);

                    Completed?.Invoke(this, EventArgs.Empty);
                }
            }
            catch (TaskCanceledException)
            {
                // the subscription was canceled.
            }
            finally
            {
                Dispose();
            }
        }
        protected override async Task HandleAsync(
            ISocketConnection connection,
            InitializeConnectionMessage message,
            CancellationToken cancellationToken)
        {
            ConnectionStatus connectionStatus =
                await _socketSessionInterceptor.OnConnectAsync(
                    connection, message, cancellationToken);

            if (connectionStatus.Accepted)
            {
                await connection.SendAsync(AcceptConnectionMessage.Default, cancellationToken);

                await connection.SendAsync(KeepConnectionAliveMessage.Default, cancellationToken);
            }
            else
            {
                var rejectMessage = connectionStatus.Extensions == null
                    ? new RejectConnectionMessage(connectionStatus.Message)
                    : new RejectConnectionMessage(
                    connectionStatus.Message,
                    connectionStatus.Extensions);

                await connection.SendAsync(
                    rejectMessage.Serialize(),
                    cancellationToken);

                await connection.CloseAsync(
                    connectionStatus.Message,
                    SocketCloseStatus.PolicyViolation,
                    cancellationToken);
            }
        }
Пример #3
0
        private async Task SendResultsAsync()
        {
            try
            {
                await foreach (IQueryResult result in
                               _responseStream.ReadResultsAsync().WithCancellation(_cts.Token))
                {
                    using (result)
                    {
                        await _connection.SendAsync(new DataResultMessage(Id, result), _cts.Token);
                    }
                }

                if (!_cts.IsCancellationRequested)
                {
                    await _connection.SendAsync(new DataCompleteMessage(Id), _cts.Token);

                    Completed?.Invoke(this, EventArgs.Empty);
                }
            }
            catch (OperationCanceledException) { }
            catch (ObjectDisposedException) { }
            catch (Exception ex)
            {
                if (!_cts.IsCancellationRequested)
                {
                    IError error =
                        ErrorBuilder
                        .New()
                        .SetException(ex)
                        .SetCode(ErrorCodes.Execution.TaskProcessingError)
                        .SetMessage("Unexpected Execution Error")
                        .Build();

                    IQueryResult result = QueryResultBuilder.CreateError(error);
                    try
                    {
                        await _connection.SendAsync(new DataResultMessage(Id, result), _cts.Token);
                    }
                    finally
                    {
                        await _connection.SendAsync(new DataCompleteMessage(Id), _cts.Token);

                        Completed?.Invoke(this, EventArgs.Empty);
                    }
                }
            }
            finally
            {
                Dispose();
            }
        }
Пример #4
0
    private static async Task HandleQueryResultAsync(
        ISocketConnection connection,
        DataStartMessage message,
        IQueryResult queryResult,
        CancellationToken cancellationToken)
    {
        await connection.SendAsync(
            new DataResultMessage(message.Id, queryResult).Serialize(),
            cancellationToken);

        await connection.SendAsync(
            new DataCompleteMessage(message.Id).Serialize(),
            cancellationToken);
    }
        private async Task KeepConnectionAliveAsync(
            CancellationToken cancellationToken)
        {
            try
            {
                while (!_connection.Closed && !cancellationToken.IsCancellationRequested)
                {
                    await Task.Delay(_timeout, cancellationToken);

                    if (!_connection.Closed)
                    {
                        await _connection.SendAsync(
                            KeepConnectionAliveMessage.Default.Serialize(),
                            cancellationToken);
                    }
                }
            }
            catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested)
            {
                // the message processing was canceled.
            }
            catch (WebSocketException)
            {
                // we will just stop receiving
            }
        }
        private async Task KeepConnectionAliveAsync(
            CancellationToken cancellationToken)
        {
            try
            {
                while (!_connection.Closed &&
                       !cancellationToken.IsCancellationRequested)
                {
                    await Task.Delay(_timeout, cancellationToken)
                    .ConfigureAwait(false);

                    if (!_connection.Closed)
                    {
                        await _connection.SendAsync(
                            KeepConnectionAliveMessage.Default.Serialize(),
                            cancellationToken)
                        .ConfigureAwait(false);
                    }
                }
            }
            catch (TaskCanceledException)
            {
                // the message processing was canceled.
            }
        }
Пример #7
0
        private async Task RegisterInternalAsync(
            ISubscription subscription,
            ISocketConnection connection)
        {
            if (_subs.TryAdd(subscription.Id, new Sub(subscription, connection)))
            {
                connection.Disposed += (sender, args) => RemoveSubscription(subscription.Id);

                if (connection.IsClosed)
                {
                    _subs.TryRemove(subscription.Id, out _);
                    return;
                }

                subscription.OnRegister(() => UnregisterAsync(subscription.Id));

                var writer = new SocketMessageWriter();

                writer.WriteStartObject();
                writer.WriteType(MessageTypes.Subscription.Start);
                writer.WriteId(subscription.Id);
                writer.WriteStartPayload();
                subscription.OperationFormatter.Serialize(subscription.Operation, writer);
                writer.WriteEndObject();

                await connection.SendAsync(writer.Body).ConfigureAwait(false);
            }
        }
        protected override async Task HandleAsync(
            ISocketConnection connection,
            InitializeConnectionMessage message,
            CancellationToken cancellationToken)
        {
            ConnectionStatus connectionStatus =
                _connectMessageInterceptor == null
                    ? ConnectionStatus.Accept()
                    : await _connectMessageInterceptor.OnReceiveAsync(
                    connection, message, cancellationToken)
                .ConfigureAwait(false);

            if (connectionStatus.Accepted)
            {
                await connection.SendAsync(
                    AcceptConnectionMessage.Default.Serialize(),
                    cancellationToken)
                .ConfigureAwait(false);

                await connection.SendAsync(
                    KeepConnectionAliveMessage.Default.Serialize(),
                    cancellationToken)
                .ConfigureAwait(false);
            }
            else
            {
                var rejectMessage = connectionStatus.Extensions == null
                    ? new RejectConnectionMessage(
                    connectionStatus.Message)
                    : new RejectConnectionMessage(
                    connectionStatus.Message,
                    connectionStatus.Extensions);

                await connection.SendAsync(
                    rejectMessage.Serialize(),
                    cancellationToken)
                .ConfigureAwait(false);

                // TODO : resources
                await connection.CloseAsync(
                    connectionStatus.Message,
                    SocketCloseStatus.PolicyViolation,
                    cancellationToken)
                .ConfigureAwait(false);
            }
        }
Пример #9
0
    private static async Task HandleStreamResultAsync(
        ISocketConnection connection,
        DataStartMessage message,
        IResponseStream responseStream,
        CancellationToken cancellationToken)
    {
        await foreach (IQueryResult queryResult in responseStream.ReadResultsAsync()
                       .WithCancellation(cancellationToken))
        {
            await connection.SendAsync(
                new DataResultMessage(message.Id, queryResult).Serialize(),
                cancellationToken);
        }

        await connection.SendAsync(
            new DataCompleteMessage(message.Id).Serialize(),
            cancellationToken);
    }
        private Task TerminateConnectionAsync(
            ISocketConnection connection,
            CancellationToken cancellationToken = default)
        {
            var messageWriter = new SocketMessageWriter();

            messageWriter.WriteStartObject();
            messageWriter.WriteType(MessageTypes.Connection.Terminate);
            messageWriter.WriteEndObject();

            return(connection.SendAsync(messageWriter.Body, cancellationToken));
        }
Пример #11
0
        private async Task ExecuteTurnAsync(Button selectedButton, Player currPlayer, MainBackground boardForm)
        {
            var opposedPlayer = currPlayer == DataStatic.Me ? DataStatic.Enemy : DataStatic.Me;

            boardForm.SetTurnMsg(opposedPlayer);

            SetControlsStatus(selectedButton, currPlayer);

            if (currPlayer == DataStatic.Me)
            {
                await _socketConnection.SendAsync(selectedButton);
            }

            _judge.Move(currPlayer, selectedButton);
        }
Пример #12
0
 public async Task ProcessAsync(
     ISocketConnection connection,
     ReadOnlySequence <byte> slice,
     CancellationToken cancellationToken)
 {
     if (TryParseMessage(slice, out OperationMessage? message))
     {
         await HandleMessageAsync(connection, message, cancellationToken);
     }
     else
     {
         await connection.SendAsync(
             KeepConnectionAliveMessage.Default,
             CancellationToken.None);
     }
 }
 public async Task ProcessAsync(
     ISocketConnection connection,
     ReadOnlySequence <byte> slice,
     CancellationToken cancellationToken)
 {
     try
     {
         if (TryParseMessage(slice, out OperationMessage? message))
         {
             await HandleMessageAsync(connection, message, cancellationToken);
         }
         else
         {
             await connection.SendAsync(
                 KeepConnectionAliveMessage.Default,
                 CancellationToken.None);
         }
     }
     catch (WebSocketException)
     {
         // we will just stop receiving
     }
 }
Пример #14
0
    private async Task SendResultsAsync()
    {
        await using IResponseStream responseStream = _responseStream;
        CancellationToken cancellationToken = _sessionToken;

        try
        {
            await foreach (IQueryResult result in
                           responseStream.ReadResultsAsync().WithCancellation(cancellationToken))
            {
                using (result)
                {
                    if (!cancellationToken.IsCancellationRequested && !_connection.Closed)
                    {
                        await _connection.SendAsync(
                            new DataResultMessage(Id, result),
                            cancellationToken);
                    }
                }
            }

            if (!cancellationToken.IsCancellationRequested && !_connection.Closed)
            {
                await _connection.SendAsync(new DataCompleteMessage(Id), cancellationToken);
            }
        }
        catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested)
        {
        }
        catch (ObjectDisposedException) { }
        catch (Exception ex) when(!cancellationToken.IsCancellationRequested)
        {
            if (!_connection.Closed)
            {
                try
                {
                    try
                    {
                        await _connection.SendAsync(
                            new DataResultMessage(Id, UnknownSubscriptionError(ex)),
                            cancellationToken);
                    }
                    finally
                    {
                        await _connection.SendAsync(
                            new DataCompleteMessage(Id),
                            cancellationToken);

                        await _sessionInterceptor.OnCloseAsync(_connection, cancellationToken);
                    }
                }
                catch
                {
                    // suppress all errors, so original exception can be rethrown
                }
            }

            _diagnosticEvents.SubscriptionTransportError(Subscription, ex);
        }
        finally
        {
            // completed should be always invoked to be ensure that disposed subscription is
            // removed from subscription manager
            Completed?.Invoke(this, EventArgs.Empty);
            Dispose();
        }
    }
Пример #15
0
 public static Task SendAsync(
     this ISocketConnection connection,
     OperationMessage message,
     CancellationToken cancellationToken) =>
 connection.SendAsync(message.Serialize(), cancellationToken);