# README
websocket
websocket is a minimal and idiomatic WebSocket library for Go.
Install
go get github.com/JaegerFong/websocket
Highlights
- Minimal and idiomatic API
- First class context.Context support
- Fully passes the WebSocket autobahn-testsuite
- Single dependency
- JSON and protobuf helpers in the wsjson and wspb subpackages
- Zero alloc reads and writes
- Concurrent writes
- Close handshake
- net.Conn wrapper
- Ping pong API
- RFC 7692 permessage-deflate compression
- Compile to Wasm
Roadmap
- HTTP/2 #4
Examples
For a production quality example that demonstrates the complete API, see the echo example.
For a full stack example, see the chat example.
Server
http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
c, err := websocket.Accept(w, r, nil)
if err != nil {
// ...
}
defer c.Close(websocket.StatusInternalError, "the sky is falling")
ctx, cancel := context.WithTimeout(r.Context(), time.Second*10)
defer cancel()
var v interface{}
err = wsjson.Read(ctx, c, &v)
if err != nil {
// ...
}
log.Printf("received: %v", v)
c.Close(websocket.StatusNormalClosure, "")
})
Client
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
c, _, err := websocket.Dial(ctx, "ws://localhost:8080", nil)
if err != nil {
// ...
}
defer c.Close(websocket.StatusInternalError, "the sky is falling")
err = wsjson.Write(ctx, c, "hi")
if err != nil {
// ...
}
c.Close(websocket.StatusNormalClosure, "")
Comparison
gorilla/websocket
Advantages of gorilla/websocket:
- Mature and widely used
- Prepared writes
- Configurable buffer sizes
Advantages of github.com/JaegerFong/websocket:
- Minimal and idiomatic API
- Compare godoc of github.com/JaegerFong/websocket with gorilla/websocket side by side.
- net.Conn wrapper
- Zero alloc reads and writes (gorilla/websocket#535)
- Full context.Context support
- Dial uses net/http.Client
- Will enable easy HTTP/2 support in the future
- Gorilla writes directly to a net.Conn and so duplicates features of net/http.Client.
- Concurrent writes
- Close handshake (gorilla/websocket#448)
- Idiomatic ping pong API
- Gorilla requires registering a pong callback before sending a Ping
- Can target Wasm (gorilla/websocket#432)
- Transparent message buffer reuse with wsjson and wspb subpackages
- 1.75x faster WebSocket masking implementation in pure Go
- Gorilla's implementation is slower and uses unsafe.
- Full permessage-deflate compression extension support
- Gorilla only supports no context takeover mode
- We use klauspost/compress for much lower memory usage (gorilla/websocket#203)
- CloseRead helper (gorilla/websocket#492)
- Actively maintained (gorilla/websocket#370)
golang.org/x/net/websocket
golang.org/x/net/websocket is deprecated. See golang/go/issues/18152.
The net.Conn can help in transitioning to github.com/JaegerFong/websocket.
gobwas/ws
gobwas/ws has an extremely flexible API that allows it to be used in an event driven style for performance. See the author's blog post.
However when writing idiomatic Go, github.com/JaegerFong/websocket will be faster and easier to use.
# Functions
Accept accepts a WebSocket handshake from a client and upgrades the the connection to a WebSocket.
CloseStatus is a convenience wrapper around Go 1.13's errors.As to grab the status code from a CloseError.
Dial performs a WebSocket handshake on url.
NetConn converts a *websocket.Conn into a net.Conn.
# Constants
CompressionContextTakeover uses a flate.Reader and flate.Writer per connection.
CompressionDisabled disables the deflate extension.
CompressionNoContextTakeover grabs a new flate.Reader and flate.Writer as needed for every message.
MessageBinary is for binary messages like protobufs.
MessageText is for UTF-8 encoded text messages like JSON.
StatusAbnormalClosure is exported for use only with Wasm.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
StatusNoStatusRcvd cannot be sent in a close message.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
StatusTLSHandshake is only exported for use with Wasm.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
These are only the status codes defined by the protocol.
# Structs
AcceptOptions represents Accept's options.
CloseError is returned when the connection is closed with a status and reason.
Conn represents a WebSocket connection.
DialOptions represents Dial's options.
# Type aliases
CompressionMode represents the modes available to the deflate extension.
MessageType represents the type of a WebSocket message.
StatusCode represents a WebSocket status code.