github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/vendor_skip/nhooyr.io/websocket/README.md (about) 1 # websocket 2 3 [![godoc](https://godoc.org/nhooyr.io/websocket?status.svg)](https://pkg.go.dev/nhooyr.io/websocket) 4 [![coverage](https://img.shields.io/badge/coverage-88%25-success)](https://nhooyrio-websocket-coverage.netlify.app) 5 6 websocket is a minimal and idiomatic WebSocket library for Go. 7 8 ## Install 9 10 ```bash 11 go get nhooyr.io/websocket 12 ``` 13 14 ## Highlights 15 16 - Minimal and idiomatic API 17 - First class [context.Context](https://blog.golang.org/context) support 18 - Fully passes the WebSocket [autobahn-testsuite](https://github.com/crossbario/autobahn-testsuite) 19 - [Single dependency](https://pkg.go.dev/nhooyr.io/websocket?tab=imports) 20 - JSON and protobuf helpers in the [wsjson](https://pkg.go.dev/nhooyr.io/websocket/wsjson) and [wspb](https://pkg.go.dev/nhooyr.io/websocket/wspb) subpackages 21 - Zero alloc reads and writes 22 - Concurrent writes 23 - [Close handshake](https://pkg.go.dev/nhooyr.io/websocket#Conn.Close) 24 - [net.Conn](https://pkg.go.dev/nhooyr.io/websocket#NetConn) wrapper 25 - [Ping pong](https://pkg.go.dev/nhooyr.io/websocket#Conn.Ping) API 26 - [RFC 7692](https://tools.ietf.org/html/rfc7692) permessage-deflate compression 27 - Compile to [Wasm](https://pkg.go.dev/nhooyr.io/websocket#hdr-Wasm) 28 29 ## Roadmap 30 31 - [ ] HTTP/2 [#4](https://github.com/nhooyr/websocket/issues/4) 32 33 ## Examples 34 35 For a production quality example that demonstrates the complete API, see the 36 [echo example](./examples/echo). 37 38 For a full stack example, see the [chat example](./examples/chat). 39 40 ### Server 41 42 ```go 43 http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { 44 c, err := websocket.Accept(w, r, nil) 45 if err != nil { 46 // ... 47 } 48 defer c.Close(websocket.StatusInternalError, "the sky is falling") 49 50 ctx, cancel := context.WithTimeout(r.Context(), time.Second*10) 51 defer cancel() 52 53 var v interface{} 54 err = wsjson.Read(ctx, c, &v) 55 if err != nil { 56 // ... 57 } 58 59 log.Printf("received: %v", v) 60 61 c.Close(websocket.StatusNormalClosure, "") 62 }) 63 ``` 64 65 ### Client 66 67 ```go 68 ctx, cancel := context.WithTimeout(context.Background(), time.Minute) 69 defer cancel() 70 71 c, _, err := websocket.Dial(ctx, "ws://localhost:8080", nil) 72 if err != nil { 73 // ... 74 } 75 defer c.Close(websocket.StatusInternalError, "the sky is falling") 76 77 err = wsjson.Write(ctx, c, "hi") 78 if err != nil { 79 // ... 80 } 81 82 c.Close(websocket.StatusNormalClosure, "") 83 ``` 84 85 ## Comparison 86 87 ### gorilla/websocket 88 89 Advantages of [gorilla/websocket](https://github.com/gorilla/websocket): 90 91 - Mature and widely used 92 - [Prepared writes](https://pkg.go.dev/github.com/gorilla/websocket#PreparedMessage) 93 - Configurable [buffer sizes](https://pkg.go.dev/github.com/gorilla/websocket#hdr-Buffers) 94 95 Advantages of nhooyr.io/websocket: 96 97 - Minimal and idiomatic API 98 - Compare godoc of [nhooyr.io/websocket](https://pkg.go.dev/nhooyr.io/websocket) with [gorilla/websocket](https://pkg.go.dev/github.com/gorilla/websocket) side by side. 99 - [net.Conn](https://pkg.go.dev/nhooyr.io/websocket#NetConn) wrapper 100 - Zero alloc reads and writes ([gorilla/websocket#535](https://github.com/gorilla/websocket/issues/535)) 101 - Full [context.Context](https://blog.golang.org/context) support 102 - Dial uses [net/http.Client](https://golang.org/pkg/net/http/#Client) 103 - Will enable easy HTTP/2 support in the future 104 - Gorilla writes directly to a net.Conn and so duplicates features of net/http.Client. 105 - Concurrent writes 106 - Close handshake ([gorilla/websocket#448](https://github.com/gorilla/websocket/issues/448)) 107 - Idiomatic [ping pong](https://pkg.go.dev/nhooyr.io/websocket#Conn.Ping) API 108 - Gorilla requires registering a pong callback before sending a Ping 109 - Can target Wasm ([gorilla/websocket#432](https://github.com/gorilla/websocket/issues/432)) 110 - Transparent message buffer reuse with [wsjson](https://pkg.go.dev/nhooyr.io/websocket/wsjson) and [wspb](https://pkg.go.dev/nhooyr.io/websocket/wspb) subpackages 111 - [1.75x](https://github.com/nhooyr/websocket/releases/tag/v1.7.4) faster WebSocket masking implementation in pure Go 112 - Gorilla's implementation is slower and uses [unsafe](https://golang.org/pkg/unsafe/). 113 - Full [permessage-deflate](https://tools.ietf.org/html/rfc7692) compression extension support 114 - Gorilla only supports no context takeover mode 115 - We use [klauspost/compress](https://github.com/klauspost/compress) for much lower memory usage ([gorilla/websocket#203](https://github.com/gorilla/websocket/issues/203)) 116 - [CloseRead](https://pkg.go.dev/nhooyr.io/websocket#Conn.CloseRead) helper ([gorilla/websocket#492](https://github.com/gorilla/websocket/issues/492)) 117 - Actively maintained ([gorilla/websocket#370](https://github.com/gorilla/websocket/issues/370)) 118 119 #### golang.org/x/net/websocket 120 121 [golang.org/x/net/websocket](https://pkg.go.dev/golang.org/x/net/websocket) is deprecated. 122 See [golang/go/issues/18152](https://github.com/golang/go/issues/18152). 123 124 The [net.Conn](https://pkg.go.dev/nhooyr.io/websocket#NetConn) can help in transitioning 125 to nhooyr.io/websocket. 126 127 #### gobwas/ws 128 129 [gobwas/ws](https://github.com/gobwas/ws) has an extremely flexible API that allows it to be used 130 in an event driven style for performance. See the author's [blog post](https://medium.freecodecamp.org/million-websockets-and-go-cc58418460bb). 131 132 However when writing idiomatic Go, nhooyr.io/websocket will be faster and easier to use.