So... a few initial thoughts / queries from a brief look through. I'll try to do a more detailed review later
1. I don't see any mechanism for connection retry / alternate hosts in the connect operation / connection-options parameter ; further I presume there is no mechanism for attempted automated failover on connection error - is this something that would be in a later scope? 2. In connection options i) it seems weird for virtual-host to be thought of as part of "identity" when it is really an instruction about the remote server ii) The modelling of SASL is very tied to the "username/password" model. Identity defines a "user" property - what does this represent if not part of the SASL exchange? In the SASL section there is password section - which only applies to traditional username/password mechanisms. From a protocol point of view the client gets to choose from the mechanisms offered by the server, and the form of the credentials for each mechanism may differ. For maximum flexibility I would think we would want something like a credentials "bag", and an ordered list of mechanisms. Each mechanism would define what properties it needs to retrieve from the credentials bag (e.g. an oauth token, or maybe a tls-client-certificate). iii) The tls options seem inadequate - how would the client express that it wanted to send a particular client certificate, for instance, also which certificates to trust (individual certs or CAs), CRLs, etc... iv) Given the very directional notion of TCP connections / SASL - I'm not sure the same data structure should/can be used for both establishing outgoing connections and incoming connections. TLS (at least) would be expected to treat "client" and "server" in the same sense as the TCP connection I assume. Would the same also be true of SASL? 3. I don't see a provision for using protocols other than AMQP directly over TCP (e.g. how about websockets?) 4. After connection establishment, does the connection provide a way of accessing information that was exchanged at the TLS or SASL layers 5. In the connection object we have properties, offered-capabilities and desired-capabilities - are these referring to the values that were sent by the client to the remote container or the values sent by the remote to the client? (Given the default value is "discovered I presume these are supposed to be the values sent from the remote side, in which case the description "Extensions the endpoint can use" is incorrect - they are capabilities the remote side would like to use. Similarly the virtual-host and container-id - are these representing the virtual-host the remote container desires to attach to, and the container-id by which the remote side identifies itself? 6. receiver-options - "auto-accept : Automatically accept deliveries that are not explicitly acknowledged"... what does this mean - when does the accept happen, when the message is initially received, or only if the delivery somehow goes out of scope? 7. receiver-options - how do auto-settle and delivery-mode interact? 8. There appears to be no way in delivery.reject to provide additional information. There also does not seem to be a way of setting the modified outcome. Also, is there a way for the client to be informed where the remote side has spontaneously set the outcome? The messaging handler only seems to allow for being informed of outcome changes for sent messages (via trackers) not received messages. -- Rob On Mon, 13 Jan 2020 at 13:40, Justin Ross <justin.r...@gmail.com> wrote: > Hi, everyone. For a while now, some members of the Qpid community have > been working on a new style of messaging API. It now has a reasonable > shape, and we want to share it and get your feedback. > > We currently offer either JMS or Proton's reactive API. These certainly > aren't going anywhere - they're important - but for some use cases, the > absence of a high-level command-oriented API for AMQP messaging is a source > of inconvenience. > > This inconvenience comes in two forms. First, JMS is helpfully imperative > (in part - it contains multitudes), but it doesn't expose some of the > things you can do with AMQP. And it can't reasonably expose those things, > because that would break the contract of the JMS API. Second, the Proton > APIs, since they are reactive, make it harder to handle cases where you > need to sequence the processing of events. > > The imperative client API we are talking about here uses modern language > support for futures or coroutines. Most of the API's operation is > asynchronous, but you can easily introduce blocking where you need to. > > It's a client API only. We think a comparably high-level server API would > be its own dedicated thing, functioning more like Python Flask or JAX-RS. > In any case, the Proton reactive API is already a good fit for writing > servers. > > We have the outline of the API and some proof-of-concept implementations, > but much remains to be done. We anticipate that this work will ultimately > become a sub-module of Proton, such as proton/client. > > The API spec: > http://www.ssorj.net/pumpjack/client/index.html > > I've worked on the Python prototypes, so I'll share them here. I did these > some time ago, so they need updating for the latest API spec changes, but > they serve to show how the API can use futures or coroutines. (For Python, > coroutines are the preferred approach.) > > Python prototype (future-based): > https://github.com/ssorj/gambit/blob/futures/python/demo.py > https://github.com/ssorj/gambit/blob/futures/python/gambit.py > > Python prototype (coroutine-based): > https://github.com/ssorj/gambit/blob/asyncio2/python/demo.py > https://github.com/ssorj/gambit/blob/asyncio2/python/gambit.py > > Some of the other folks who have done exploratory work will follow up on > this thread to show what they've done. > > Some caveats: this is in early stages, and the API will change as we > discuss it more. There are also big outstanding pieces to look at, such as > reconnect and failover, to name just one. > > Thanks for your time, and please let us know what you think. >