# README
websocket
websocket is a minimal and idiomatic WebSocket library for Go.
Install
go get github.com/switchupcb/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/switchupcb/websocket:
- Minimal and idiomatic API
- Compare godoc of github.com/switchupcb/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/switchupcb/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/switchupcb/websocket will be faster and easier to use.
# Packages
No description provided by the author
No description provided by the author
Package test contains subpackages only used in tests.
Package wsjson provides helpers for reading and writing JSON messages.
Package wspb provides helpers for reading and writing protobuf messages.
No description provided by the author
# 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.