This is a high-performance, lightweight WebSocket library for Go.
- High performance, usually several times faster than other tested libraries (see below)
- Zero allocations
- Zero copy writev path when writing fragments
- Support for both client and server implementations
- Customizable buffer pool for efficient memory management
- High level API heavily inspired by the popular gorilla/websocket
- No third party dependencies
- Tested with autobahn-testsuite
- UTF-8 validation of text messages, this can be handled at the application layer
- WebSocket compression
To install the library, use go get
:
go get github.com/simonfxr/wszero
Here's a simple example of how to create a WebSocket server:
package main
import (
"log"
"net/http"
"github.com/simonfxr/wszero"
)
func main() {
upgrader := &wszero.Upgrader{}
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Upgrade error:", err)
return
}
defer conn.Close()
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println("Read error:", err)
return
}
if err := conn.WriteMessage(messageType, p); err != nil {
log.Println("Write error:", err)
return
}
// (optional) return buffer to the pool
conn.BufferPool().PutBuffer(p)
}
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
Here's how to create a WebSocket client:
package main
import (
"context"
"github.com/simonfxr/wszero"
"log"
)
func main() {
dialer := wszero.DefaultDialer
conn, _, err := dialer.DialContext(context.Background(), "ws://localhost:8080/ws", nil)
if err != nil {
log.Fatal("Dial error:", err)
}
defer conn.Close()
err = conn.WriteMessageString(wszero.TextMessage, "Hello, WebSocket!")
if err != nil {
log.Fatal("Write error:", err)
}
_, message, err := conn.ReadMessage()
if err != nil {
log.Fatal("Read error:", err)
}
log.Printf("Received: %s", message)
}
For detailed documentation, please refer to the GoDoc page.
The implementation passes all tests in the Autobahn Testsuite except those that are related to the explicitly missing features listed above (UTF-8 validation of text messages and message compression).
Benchmarks results on an AMD Ryzen 9 7950X using go 1.22.4.
BenchmarkWriteMessage/wszero[msgsz=2]-12 797.5 ns/op 2.51 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/websocket[msgsz=2]-12 1403 ns/op 1.43 MB/s 76 B/op 3 allocs/op
BenchmarkWriteMessage/gobwas[msgsz=2]-12 2017 ns/op 0.99 MB/s 40 B/op 3 allocs/op
BenchmarkWriteMessage/nhooyr[msgsz=2]-12 1454 ns/op 1.38 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/wszero[msgsz=128]-12 1069 ns/op 119.72 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/websocket[msgsz=128]-12 1421 ns/op 90.08 MB/s 76 B/op 3 allocs/op
BenchmarkWriteMessage/gobwas[msgsz=128]-12 1931 ns/op 66.30 MB/s 40 B/op 2 allocs/op
BenchmarkWriteMessage/nhooyr[msgsz=128]-12 1577 ns/op 81.16 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/wszero[msgsz=32768]-12 2281 ns/op 14365.28 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/websocket[msgsz=32768]-12 11990 ns/op 2732.87 MB/s 104 B/op 10 allocs/op
BenchmarkWriteMessage/gobwas[msgsz=32768]-12 3987 ns/op 8218.34 MB/s 40 B/op 2 allocs/op
BenchmarkWriteMessage/nhooyr[msgsz=32768]-12 8418 ns/op 3892.80 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/wszero[msgsz=262144]-12 14829 ns/op 17678.03 MB/s 0 B/op 0 allocs/op
BenchmarkWriteMessage/websocket[msgsz=262144]-12 114598 ns/op 2287.51 MB/s 328 B/op 66 allocs/op
BenchmarkWriteMessage/gobwas[msgsz=262144]-12 57441 ns/op 4563.70 MB/s 262186 B/op 3 allocs/op
BenchmarkWriteMessage/nhooyr[msgsz=262144]-12 75932 ns/op 3452.36 MB/ 0 B/op 0 allocs/op
BenchmarkReadMessage/client/wszero[msgsz=2]-12 19.99 ns/op 200.10 MB/s 0 B/op 0 allocs/op
BenchmarkReadMessage/client/websocket[msgsz=2]-12 123.2 ns/op 32.47 MB/s 520 B/op 2 allocs/op
BenchmarkReadMessage/client/gobwas[msgsz=2]-12 657.6 ns/op 6.08 MB/s 720 B/op 3 allocs/op
BenchmarkReadMessage/client/nhooyr[msgsz=2]-12 1124 ns/op 3.56 MB/s 512 B/op 1 allocs/op
BenchmarkReadMessage/client/wszero[msgsz=128]-12 42.45 ns/op 3109.90 MB/s 0 B/op 0 allocs/op
BenchmarkReadMessage/client/websocket[msgsz=128]-12 166.7 ns/op 791.96 MB/s 520 B/op 2 allocs/op
BenchmarkReadMessage/client/gobwas[msgsz=128]-12 861.3 ns/op 153.25 MB/s 720 B/op 3 allocs/op
BenchmarkReadMessage/client/nhooyr[msgsz=128]-12 1188 ns/op 111.09 MB/s 512 B/op 1 allocs/op
BenchmarkReadMessage/client/wszero[msgsz=32768]-12 3008 ns/op 10894.07 MB/s 0 B/op 0 allocs/op
BenchmarkReadMessage/client/websocket[msgsz=32768]-12 28812 ns/op 1137.43 MB/s 153866 B/op 15 allocs/op
BenchmarkReadMessage/client/gobwas[msgsz=32768]-12 26988 ns/op 1214.30 MB/s 154066 B/op 16 allocs/op
BenchmarkReadMessage/client/nhooyr[msgsz=32768]-12 47741 ns/op 686.46 MB/s 153860 B/op 14 allocs/op
BenchmarkReadMessage/server-randmask/wszero[msgsz=2]-12 22.09 ns/op 362.15 MB/s 0 B/op 0 allocs/op
BenchmarkReadMessage/server-randmask/websocket[msgsz=2]-12 137.9 ns/op 58.03 MB/s 520 B/op 2 allocs/op
BenchmarkReadMessage/server-randmask/gobwas[msgsz=2]-12 860.7 ns/op 9.29 MB/s 752 B/op 4 allocs/op
BenchmarkReadMessage/server-randmask/nhooyr[msgsz=2]-12 1071 ns/op 7.47 MB/s 512 B/op 1 allocs/op
BenchmarkReadMessage/server-randmask/wszero[msgsz=128]-12 44.20 ns/op 3077.26 MB/s 0 B/op 0 allocs/op
BenchmarkReadMessage/server-randmask/websocket[msgsz=128]-12 179.4 ns/op 757.95 MB/s 520 B/op 2 allocs/op
BenchmarkReadMessage/server-randmask/gobwas[msgsz=128]-12 895.6 ns/op 151.86 MB/s 752 B/op 4 allocs/op
BenchmarkReadMessage/server-randmask/nhooyr[msgsz=128]-12 1150 ns/op 118.28 MB/s 512 B/op 1 allocs/op
BenchmarkReadMessage/server-randmask/wszero[msgsz=32768]-12 2931 ns/op 11182.41 MB/s 0 B/op 0 allocs/op
BenchmarkReadMessage/server-randmask/websocket[msgsz=32768]-12 30984 ns/op 1057.83 MB/s 153866 B/op 15 allocs/op
BenchmarkReadMessage/server-randmask/gobwas[msgsz=32768]-12 29046 ns/op 1128.42 MB/s 154098 B/op 17 allocs/op
BenchmarkReadMessage/server-randmask/nhooyr[msgsz=32768]-12 49740 ns/op 658.95 MB/s 153860 B/op 14 allocs/op
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.
Here is a selection of some existing similar projects