= Changes in Version 2 mangos has been quite successful, but over the past several years we've worked on NNG and nanomsg, as well as mangos. We wanted to make some improvements, using what we learned, and some of those required breaking changes. Hence v2. Version 1 is still available, so feel free to keep using it for now. (Eventually we'll deprecate that in favor of v2, but until v2 fully stabilizes we're not ready.) The rest of this document is meant as a transition guide. Some of this is still in transition, so YMMV. == Import path changed Use `nanomsg.org/go/mangos/v2` as the base URL for imports. == Go v1.9 Or Better Required Some support for older Go versions is being removed. Additionally, our adoption of new APIs means that older versions of Go won't work. == `compat` Package Removed Nobody was using, as it was a transition for a much older FFI based on nanomsg. That FFI has been abandonware for a long time. == New Raw Mode Packages Raw mode sockets are now in their own packages, e.g. `xreq` instead of `req`. This is similar to the Martin's original libnanomsg library. The `OptionRawMode` option has transitioned to being read-only. == `Protocol` API mostly removed This API is being completely refactored, and should not be used. Don't rely on it, new style protocols don't implement it. (Soon none of the protocols will.) == Removal of Some Irrelevant Options For some protocols, we have removed irrelevant options. For example, tuning the send queue depth (`OptionWriteQLen`) makes no sense for the `REQ` protocol (not raw mode). Likewise `OptionBestEffort` makes no sense with a broadcast protocol like `SURVEYOR`. So those options will report an error now. == `errors` package To facilitate some uses, the errors have been moved into their own package. There are still aliases left behind. == New Context Support Some protocols (e.g. REQ, REP, SURVEYOR, and RESPONDENT) support the notion of Contexts. These can be opened on a socket, and each context maintains its own state, including outstanding request IDs, timers, and so forth. This makes it possible (for exmaple) for many synchronous go routines to share a single socket, each having it's own context. See the `OpenContext()` function in the `protocol.ProtocolBase` interface. == Info API Changed Protocols now return their numeric and string IDs, as well as those of their APIs, via a new `Info()` API, which replaces the old `Number()`, `Name()`, and similar APIs. == Properties API Merged into Options The old `pipe.GetProp()` API is changed so that Properties are formalized as Options and a `pipe.GetOpt()` API is used to access them. == STAR Raw Mode Fixed The xstar protocol implicitly retransmits / forwards received messages just like the cooked protocol. The fact that v1 did not do this was a bug. == Dial Now Synchronous When using vanilla `Dialer.Dial()`, the calling thread will normally be blocked until either a connection is established, or an error occurs on this first attempt. If an error occurs, there will be no further retries. However, the self-healing mode is used for subsequent connection attempts. This mode is intended to facilitate folks who are trying to fix the most common connection setup errors. An option, `OptionDialAsynch`, can be set on sockets or dialers to restore the old behavior, where a dialer will just run in the background from the beginning. == Port API changed to Pipe The `Message.Port` is changed to use a new `Pipe` interface, which has some differences but conversion should be straight-forward. (Few applications used this API.) Also the `PortHook` API is now replaced with a `PipeEventHook` API, and a separate event is used for pre-attach and post-attach. This turns out to be useful in circumstances where one wants to be certain that the pipe is connected before taking some action. Note that `Pipe.GetOption` will fallback to looking for the `Dialer` or `Listener` option if it doesn't have a local value. == `Message.Expired` removed This API turns out to be not very useful, and we have elected to just eliminate it entirely. It was only intended for use by transports, and then only to cope with cases where a Message might have been stuck in a queue for a long time. == `Protocol.ProtocolName` removed The ability to lookup protocol names by their protocol number is removed. Each protocol instead has their identities (including name and string) as constants (`Self`, `Peer`, `SelfName`, and `PeerName`) in the package. == Simplified Transport registration To register a transport, just import the transport package. (You can use an anonymous import (i.e. an underscore import) to bring transport packages in. The `AddTransport()` method on sockets, and `NewTransport()` method for transport packages have been removed. (Transport implementations can register themselves with transport.RegisterTransport().)