77 lines
2.9 KiB
Go
77 lines
2.9 KiB
Go
|
package quic
|
||
|
|
||
|
import (
|
||
|
"crypto/tls"
|
||
|
"io"
|
||
|
"net"
|
||
|
|
||
|
"github.com/lucas-clemente/quic-go/protocol"
|
||
|
)
|
||
|
|
||
|
// Stream is the interface implemented by QUIC streams
|
||
|
type Stream interface {
|
||
|
io.Reader
|
||
|
io.Writer
|
||
|
io.Closer
|
||
|
StreamID() protocol.StreamID
|
||
|
// Reset closes the stream with an error.
|
||
|
Reset(error)
|
||
|
}
|
||
|
|
||
|
// A Session is a QUIC connection between two peers.
|
||
|
type Session interface {
|
||
|
// AcceptStream returns the next stream opened by the peer, blocking until one is available.
|
||
|
// Since stream 1 is reserved for the crypto stream, the first stream is either 2 (for a client) or 3 (for a server).
|
||
|
AcceptStream() (Stream, error)
|
||
|
// OpenStream opens a new QUIC stream, returning a special error when the peeer's concurrent stream limit is reached.
|
||
|
// New streams always have the smallest possible stream ID.
|
||
|
// TODO: Enable testing for the special error
|
||
|
OpenStream() (Stream, error)
|
||
|
// OpenStreamSync opens a new QUIC stream, blocking until the peer's concurrent stream limit allows a new stream to be opened.
|
||
|
// It always picks the smallest possible stream ID.
|
||
|
OpenStreamSync() (Stream, error)
|
||
|
// LocalAddr returns the local address.
|
||
|
LocalAddr() net.Addr
|
||
|
// RemoteAddr returns the address of the peer.
|
||
|
RemoteAddr() net.Addr
|
||
|
// Close closes the connection. The error will be sent to the remote peer in a CONNECTION_CLOSE frame. An error value of nil is allowed and will cause a normal PeerGoingAway to be sent.
|
||
|
Close(error) error
|
||
|
}
|
||
|
|
||
|
// ConnState is the status of the connection
|
||
|
type ConnState int
|
||
|
|
||
|
const (
|
||
|
// ConnStateInitial is the initial state
|
||
|
ConnStateInitial ConnState = iota
|
||
|
// ConnStateVersionNegotiated means that version negotiation is complete
|
||
|
ConnStateVersionNegotiated
|
||
|
// ConnStateSecure means that the connection is encrypted
|
||
|
ConnStateSecure
|
||
|
// ConnStateForwardSecure means that the connection is forward secure
|
||
|
ConnStateForwardSecure
|
||
|
)
|
||
|
|
||
|
// ConnStateCallback is called every time the connection moves to another connection state.
|
||
|
type ConnStateCallback func(Session, ConnState)
|
||
|
|
||
|
// Config contains all configuration data needed for a QUIC server or client.
|
||
|
// More config parameters (such as timeouts) will be added soon, see e.g. https://github.com/lucas-clemente/quic-go/issues/441.
|
||
|
type Config struct {
|
||
|
TLSConfig *tls.Config
|
||
|
// ConnStateCallback will be called when the QUIC version is successfully negotiated or when the encryption level changes.
|
||
|
// If this field is not set, the Dial functions will return only when the connection is forward secure.
|
||
|
// Callbacks have to be thread-safe, since they might be called in separate goroutines.
|
||
|
ConnState ConnStateCallback
|
||
|
}
|
||
|
|
||
|
// A Listener for incoming QUIC connections
|
||
|
type Listener interface {
|
||
|
// Close the server, sending CONNECTION_CLOSE frames to each peer.
|
||
|
Close() error
|
||
|
// Addr returns the local network addr that the server is listening on.
|
||
|
Addr() net.Addr
|
||
|
// Serve starts the main server loop, and blocks until a network error occurs or the server is closed.
|
||
|
Serve() error
|
||
|
}
|