README.md 1.91 KB
Newer Older
Armon Dadgar's avatar
Armon Dadgar committed
1 2
# Yamux

Armon Dadgar's avatar
Armon Dadgar committed
3
Yamux (Yet another Multiplexer) is a multiplexing library for Golang.
Armon Dadgar's avatar
Armon Dadgar committed
4
It relies on an underlying connection to provide reliability
Armon Dadgar's avatar
Armon Dadgar committed
5
and ordering, such as TCP or Unix domain sockets, and provides
Armon Dadgar's avatar
Armon Dadgar committed
6 7 8 9 10
stream-oriented multiplexing. It is inspired by SPDY but is not
interoperable with it.

Yamux features include:

Armon Dadgar's avatar
Armon Dadgar committed
11 12 13 14
* Bi-directional streams
  * Streams can be opened by either client or server
  * Server-side push support
* Flow control
Armon Dadgar's avatar
Armon Dadgar committed
15
  * Avoid starvation
Armon Dadgar's avatar
Armon Dadgar committed
16 17 18 19
  * Back-pressure to prevent overwhelming a receiver
* Keep Alives
  * Enables persistent connections over a load balancer
* Efficient
Armon Dadgar's avatar
Armon Dadgar committed
20
  * Enables thousands of logical streams with low overhead
Armon Dadgar's avatar
Armon Dadgar committed
21 22 23

## Documentation

Steven Allen's avatar
Steven Allen committed
24
For complete documentation, see the associated [Godoc](http://godoc.org/github.com/libp2p/go-yamux).
Armon Dadgar's avatar
Armon Dadgar committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

## Specification

The full specification for Yamux is provided in the `spec.md` file.
It can be used as a guide to implementors of interoperable libraries.

## Usage

Using Yamux is remarkably simple:

```go

func client() {
    // Get a TCP connection
    conn, err := net.Dial(...)
    if err != nil {
        panic(err)
    }

    // Setup client side of yamux
    session, err := yamux.Client(conn, nil)
    if err != nil {
        panic(err)
    }

    // Open a new stream
    stream, err := session.Open()
    if err != nil {
        panic(err)
    }

    // Stream implements net.Conn
    stream.Write([]byte("ping"))
}

func server() {
    // Accept a TCP connection
    conn, err := listener.Accept()
    if err != nil {
        panic(err)
    }

    // Setup server side of yamux
    session, err := yamux.Server(conn, nil)
    if err != nil {
        panic(err)
    }

    // Accept a stream
    stream, err := session.Accept()
    if err != nil {
        panic(err)
    }

    // Listen for a message
    buf := make([]byte, 4)
    stream.Read(buf)
}

```
Armon Dadgar's avatar
Armon Dadgar committed
85

86 87
---
The last gx published version of this module was: 1.1.5: QmUNMbRUsVYHi1D14annF7Rr7pQAX7TNLwpRCa975ojKnw