blob: b42eca25fb6cdeab6613409c7a56ed5144a25c7d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Apache.Qpid.Proton.Client
{
/// <summary>
/// A single AMQP Connection instance.
/// </summary>
public interface IConnection : IDisposable
{
/// <summary>
/// Returns the parent client instance that created this connection.
/// </summary>
IClient Client { get; }
/// <summary>
/// When a connection is created and returned to the client application it may not
/// be remotely opened yet and if the client needs to wait for completion of the
/// open before proceeding the open task can be fetched and waited upon.
/// </summary>
Task<IConnection> OpenTask { get; }
/// <summary>
/// Initiates a close of the connection and awaits a response from the remote that
/// indicates completion of the close operation. If the response from the remote
/// exceeds the configure close timeout the method returns after cleaning up the
/// connection resources.
/// </summary>
/// <param name="error">Optional error condition to convey to the remote</param>
void Close(IErrorCondition error = null);
/// <summary>
/// Initiates a close of the connection and a Task that allows the caller to await
/// or poll for the response from the remote that indicates completion of the close
/// operation. If the response from the remote exceeds the configure close timeout
/// the connection will be cleaned up and the Task signalled indicating completion.
/// </summary>
/// <param name="error">Optional error condition to convey to the remote</param>
Task<IConnection> CloseAsync(IErrorCondition error = null);
/// <summary>
/// Creates a receiver used to consume messages from the given node address. The
/// returned receiver will be configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new receiver instance</returns>
IReceiver OpenReceiver(string address, ReceiverOptions options = null);
/// <summary>
/// Asynchronously creates a receiver used to consume messages from the given node address.
/// The returned receiver will be configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A Task that returns a new receiver instance when completed</returns>
Task<IReceiver> OpenReceiverAsync(string address, ReceiverOptions options = null);
/// <summary>
/// Creates a receiver used to consume messages from the given node address. The
/// returned receiver will be configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="subscriptionName">The subscription name to use for the receiver</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new receiver instance</returns>
IReceiver OpenDurableReceiver(string address, string subscriptionName, ReceiverOptions options = null);
/// <summary>
/// Asynchronously creates a receiver used to consume messages from the given node address.
/// The returned receiver will be configured using the provided receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="subscriptionName">The subscription name to use for the receiver</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A Task that returns a new receiver instance when completed</returns>
Task<IReceiver> OpenDurableReceiverAsync(string address, string subscriptionName, ReceiverOptions options = null);
/// <summary>
/// Creates a dynamic receiver used to consume messages from the dynamically generated node
/// on the remote. The returned receiver will be configured using the provided options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <param name="dynamicNodeProperties">Optional properties to assign to the node create</param>
/// <returns>A new receiver instance</returns>
IReceiver OpenDynamicReceiver(ReceiverOptions options = null, IDictionary<string, object> dynamicNodeProperties = null);
/// <summary>
/// Asynchronously creates a dynamic receiver used to consume messages from the dynamically generated node
/// on the remote. The returned receiver will be configured using the provided options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <param name="dynamicNodeProperties">Optional properties to assign to the node create</param>
/// <returns>A Task that returns a new receiver instance when completed</returns>
Task<IReceiver> OpenDynamicReceiverAsync(ReceiverOptions options = null, IDictionary<string, object> dynamicNodeProperties = null);
/// <summary>
/// Creates a stream receiver used to consume large messages from the given node address.
/// The returned receiver will be configured using the provided stream receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A new receiver instance</returns>
IStreamReceiver OpenStreamReceiver(string address, StreamReceiverOptions options = null);
/// <summary>
/// Asynchronously creates a stream receiver used to consume large messages from the given node address.
/// The returned receiver will be configured using the provided stream receiver options.
///
/// The returned receiver may not have been opened on the remote when it is returned. Some
/// methods of the receiver can block until the remote fully opens the receiver, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// receiver and using it to await the completion of the receiver open.
/// </summary>
/// <param name="address">The address of the node the receiver attaches to</param>
/// <param name="options">Optional receiver options to use for configuration</param>
/// <returns>A Task that returns a new stream receiver instance when completed</returns>
Task<IStreamReceiver> OpenStreamReceiverAsync(string address, StreamReceiverOptions options = null);
/// <summary>
/// Returns the default anonymous sender used by this connection for all send calls from the
/// connection. If the sender has not been created yet this call will initiate its creation and
/// open with the remote peer.
/// </summary>
/// <returns>The connection wide default anonymous sender instance.</returns>
ISender DefaultSender();
/// <summary>
/// Asynchronously returns the default anonymous sender used by this connection for all send calls
/// from the connection. If the sender has not been created yet this call will initiate its creation
/// and open with the remote peer.
/// </summary>
/// <returns>Task that provides the connection wide default anonymous sender instance.</returns>
Task<ISender> DefaultSenderAsync();
/// <summary>
/// Creates a sender used to send messages to the given node address. The returned sender
/// will be configured using configuration options provided.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="address">The address of the node the sender attaches to</param>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A new sender instance.</returns>
ISender OpenSender(string address, SenderOptions options = null);
/// <summary>
/// Asynchronously creates a sender used to send messages to the given node address.
/// The returned sender will be configured using configuration options provided.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="address">The address of the node the sender attaches to</param>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A Task that returns a new sender instance when completed</returns>
Task<ISender> OpenSenderAsync(string address, SenderOptions options = null);
/// <summary>
/// Creates a stream sender used to send large messages to the given node address. The
/// returned sender will be configured using configuration options provided.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="address">The address of the node the sender attaches to</param>
/// <param name="options">Optional stream sender options to use for configuration</param>
/// <returns>A new sender instance.</returns>
IStreamSender OpenStreamSender(string address, StreamSenderOptions options = null);
/// <summary>
/// Asynchronously creates a stream sender used to send large messages to the given node address.
/// The returned sender will be configured using configuration options provided.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="address">The address of the node the sender attaches to</param>
/// <param name="options">Optional stream sender options to use for configuration</param>
/// <returns>A Task that returns a new sender instance when completed</returns>
Task<IStreamSender> OpenStreamSenderAsync(string address, StreamSenderOptions options = null);
/// <summary>
/// Creates a anonymous sender used to send messages to the "anonymous relay" on the
/// remote. Each message sent must include a "to" address for the remote to route the
/// message. The returned sender will be configured using the provided sender options.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A new sender instance.</returns>
ISender OpenAnonymousSender(SenderOptions options = null);
/// <summary>
/// Asynchronously creates a anonymous sender used to send messages to the "anonymous relay"
/// on the remote. Each message sent must include a "to" address for the remote to route the
/// message. The returned sender will be configured using the provided sender options.
///
/// The returned sender may not have been opened on the remote when it is returned. Some
/// methods of the sender can block until the remote fully opens the sender, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// sender and using it to await the completion of the sender open.
/// </summary>
/// <param name="options">Optional sender options to use for configuration</param>
/// <returns>A Task that returns a new sender instance when completed</returns>
Task<ISender> OpenAnonymousSenderAsync(SenderOptions options = null);
/// <summary>
/// Returns the default session instance that is used by this Connection to create the
/// default anonymous connection sender as well as creating those resources created from
/// the connection} such as sender and receiver instances not married to a specific session.
/// </summary>
/// <returns>The default session that is owned by this connection</returns>
ISession DefaultSession();
/// <summary>
/// Asynchronously returns the default session instance that is used by this Connection to
/// create the default anonymous connection sender as well as creating those resources created
/// from the connection} such as sender and receiver instances not married to a specific session.
/// </summary>
/// <returns>A Task that results in default session that is owned by this connection</returns>
Task<ISession> DefaultSessionAsync();
/// <summary>
/// Creates a new session instance for use by the client application. The returned
/// session will be configured using the provided session options.
///
/// The returned session may not have been opened on the remote when it is returned. Some
/// methods of the session can block until the remote fully opens the session, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// session and using it to await the completion of the session open.
/// </summary>
/// <param name="options">Optional session options to use for configuration</param>
/// <returns>A new session instance.</returns>
ISession OpenSession(SessionOptions options = null);
/// <summary>
/// Asynchronously creates a new session instance for use by the client application.
/// The returned session will be configured using the provided session options.
///
/// The returned session may not have been opened on the remote when it is returned. Some
/// methods of the session can block until the remote fully opens the session, the user can
/// wait for the remote to respond to the open request by obtaining the open task from the
/// session and using it to await the completion of the session open.
/// </summary>
/// <param name="options">Optional session options to use for configuration</param>
/// <returns>A Task that result in a new session instance.</returns>
Task<ISession> OpenSessionAsync(SessionOptions options = null);
/// <summary>
/// Sends the given message using the connection scoped default sender instance. The
/// connection send uses the remote "anonymous relay" to route messages which requires
/// that the sent message have a valid "To" address set and that the remote supports
/// the anonymous relay.
/// </summary>
/// <typeparam name="T">The type of body the message carries</typeparam>
/// <param name="message">The message to be sent</param>
/// <returns>A tracker instance that can be used to track the send outcome</returns>
ITracker Send<T>(IMessage<T> message);
/// <summary>
/// Asynchronously sends the given message using the connection scoped default sender
/// instance. The connection send uses the remote "anonymous relay" to route messages
/// which requires that the sent message have a valid "To" address set and that the
/// remote supports the anonymous relay.
/// </summary>
/// <typeparam name="T">The type of body the message carries</typeparam>
/// <param name="message">The message to be sent</param>
/// <returns>A Task that results in a tracker instance that can be used to track the send outcome</returns>
Task<ITracker> SendAsync<T>(IMessage<T> message);
/// <summary>
/// Waits indefinitely for a receiver created from this session to have a delivery ready for
/// receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the configured value of the default next receiver policy that
/// was configured in the session options used to create this session, or the connection
/// level policy if none was assigned to the session options.
/// </summary>
/// <returns>The next receiver that has a pending delivery available based on policy.</returns>
IReceiver NextReceiver();
/// <summary>
/// Returns a task that will complete only after a receiver created from this connection has
/// a delivery ready for receipt. The selection of the next receiver when more than one
/// exists which has pending deliveries is based upon the configured value of the default next
/// receiver policy that was configured in the connection options used to create this connection.
/// </summary>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
Task<IReceiver> NextReceiverAsync();
/// <summary>
/// Waits indefinitely for a receiver created from this connection to have a delivery ready for
/// receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the value of the next receiver policy that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <returns></returns>
IReceiver NextReceiver(NextReceiverPolicy policy);
/// <summary>
/// Returns a task that will complete only after a receiver created from this connection has
/// a delivery ready for receipt. The selection of the next receiver when more than one
/// exists which has pending deliveries is based upon the value of the next receiver policy
/// that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
Task<IReceiver> NextReceiverAsync(NextReceiverPolicy policy);
/// <summary>
/// Waits up to the given timeout for a receiver created from this connection to have a delivery
/// ready for receipt. The selection of the next receiver when more than one exists which has
/// pending deliveries is based upon the configured value of the default next receiver policy that
/// was configured in the connection options used to create this connection.
/// </summary>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns></returns>
IReceiver NextReceiver(TimeSpan timeout);
/// <summary>
/// Returns a task that will complete once a receiver created from this connection has a delivery
/// ready for receipt or the given timeout expires. The selection of the next receiver when more
/// than one exists which has pending deliveries is based upon the configured value of the default
/// next receiver policy that was configured in the connection options used to create this connection.
/// </summary>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns></returns>
Task<IReceiver> NextReceiverAsync(TimeSpan timeout);
/// <summary>
/// Waits up to the given timeout for a receiver created from this connection to have a delivery ready
/// for receipt. The selection of the next receiver when more than one exists which has pending
/// deliveries is based upon the value of the next receiver policy that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
IReceiver NextReceiver(NextReceiverPolicy policy, TimeSpan timeout);
/// <summary>
/// Returns a task that will complete once a receiver created from this connection has a delivery
/// ready for receipt or the given timeout expires. The selection of the next receiver when more
/// than one exists which has pending deliveries is based upon the value of the next receiver policy
/// that is provided by the caller.
/// </summary>
/// <param name="policy">The next receiver policy to apply when selecting a result</param>
/// <param name="timeout">The time to wait for a receiver to have a pending delivery</param>
/// <returns>A Task that results in the next receiver that has a pending delivery available based on policy.</returns>
Task<IReceiver> NextReceiverAsync(NextReceiverPolicy policy, TimeSpan timeout);
/// <summary>
/// Returns the properties that the remote provided upon successfully opening the connection.
/// If the open has not completed yet this method will block to await the open response which
/// carries the remote properties. If the remote provides no properties this method will
/// return null.
/// </summary>
IReadOnlyDictionary<string, object> Properties { get; }
/// <summary>
/// Returns the offered capabilities that the remote provided upon successfully opening the
/// connection. If the open has not completed yet this method will block to await the open
/// response which carries the remote offered capabilities. If the remote provides no offered
/// capabilities this method will return null.
/// </summary>
IReadOnlyCollection<string> OfferedCapabilities { get; }
/// <summary>
/// Returns the desired capabilities that the remote provided upon successfully opening the
/// connection. If the open has not completed yet this method will block to await the open
/// response which carries the remote desired capabilities. If the remote provides no desired
/// capabilities this method will return null.
/// </summary>
IReadOnlyCollection<string> DesiredCapabilities { get; }
}
}