/// <exception cref="System.ObjectDisposedException">Methods were called after the stream was closed. </exception> /// <exception cref="System.NotSupportedException">The stream does not support writing, or the stream is already closed. </exception> /// <exception cref="System.InvalidOperationException">The stream is currently in use by a previous write operation. </exception> /// <exception cref="IOException">An I/O error occurs. </exception> public static async Task WriteAsync(this Stream stream, ClientMessageBase message, CancellationToken cancellationToken) { message.RequestId = GetNextRequestId(); byte[] messageBytes; using (var ms = new MemoryStream()) { using (var packer = Packer.Create(ms)) { message.PackToMessage(packer, null); messageBytes = ms.ToArray(); } } // ReSharper disable once ExceptionNotDocumented var messageLength = messageBytes.Length; stream.WriteByte(0xce); stream.WriteByte((byte)(messageLength >> 24)); stream.WriteByte((byte)(messageLength >> 16)); stream.WriteByte((byte)(messageLength >> 8)); stream.WriteByte((byte)messageLength); // ReSharper disable once ExceptionNotDocumented await stream.WriteAsync(messageBytes, 0, messageBytes.Length, cancellationToken); }
/// <summary>Send request to Tarantool server and get response.</summary> /// <param name="clientMessage">The client message.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The <see cref="Task" /> with response.</returns> public async Task <MessagePackObject> RequestAsync( ClientMessageBase clientMessage, CancellationToken cancellationToken) { Task <MessagePackObject> resultTask; using (var connection = await AcquireConnectionAsync(cancellationToken).ConfigureAwait(false)) { resultTask = await connection.RequestAsync(clientMessage, cancellationToken).ConfigureAwait(false); } return(await resultTask.ConfigureAwait(false)); }
/// <summary>Send request to Tarantool server.</summary> /// <param name="clientMessage">The client message.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The <see cref="Task" /> for awaiting the result.</returns> /// <exception cref="System.IO.IOException">An I/O error occurs. </exception> /// <exception cref="ObjectDisposedException"></exception> /// <exception cref="InvalidOperationException">The stream is currently in use by a previous write operation. </exception> /// <exception cref="TarantoolResponseException"></exception> public async Task <Task <MessagePackObject> > RequestAsync( ClientMessageBase clientMessage, CancellationToken cancellationToken) { CheckDisposed(); await _stream.WriteAsync(clientMessage, cancellationToken).ConfigureAwait(false); return(WhenResponseAsync(clientMessage.RequestId) .ContinueWith( t => { var response = t.Result; if (response.IsError) { throw new TarantoolResponseException(response.ErrorMessage, response.Code); } return response.Body; }, cancellationToken)); }
/// <summary>Performs a general request.</summary> /// <param name="clientMessage">The request.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The <see cref="Task" /> with MessagePackObject as result.</returns> public async Task <MessagePackObject> RequestAsync( ClientMessageBase clientMessage, CancellationToken cancellationToken) { return(await _connectionPool.RequestAsync(clientMessage, cancellationToken).ConfigureAwait(false)); }
/// <summary> /// Translates request to linked acquired connection. /// </summary> /// <param name="clientMessage">The client message.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The <see cref="Task"/> for awaiting the result.</returns> public Task <Task <MessagePackObject> > RequestAsync(ClientMessageBase clientMessage, CancellationToken cancellationToken) { return(_connection.RequestAsync(clientMessage, cancellationToken)); }