Add WebSocket server support

This commit is contained in:
Elara 2022-05-02 14:47:00 -07:00
parent bbc9774a96
commit a0d167ff75
3 changed files with 19 additions and 0 deletions

1
go.mod
View File

@ -6,6 +6,7 @@ require (
github.com/gofrs/uuid v4.2.0+incompatible
github.com/mitchellh/mapstructure v1.5.0
github.com/vmihailenco/msgpack/v5 v5.3.5
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4
)
require github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect

2
go.sum
View File

@ -13,6 +13,8 @@ github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9
github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@ -22,12 +22,14 @@ import (
"errors"
"io"
"net"
"net/http"
"reflect"
"sync"
"go.arsenm.dev/lrpc/codec"
"go.arsenm.dev/lrpc/internal/reflectutil"
"go.arsenm.dev/lrpc/internal/types"
"golang.org/x/net/websocket"
)
// <= go1.17 compatibility
@ -256,6 +258,20 @@ func (s *Server) Serve(ln net.Listener, cf codec.CodecFunc) {
}
}
func (s *Server) ServeWS(addr string, cf codec.CodecFunc) (err error) {
ws := websocket.Server{}
ws.Config = websocket.Config{
Version: websocket.ProtocolVersionHybi13,
}
ws.Handler = func(c *websocket.Conn) {
s.handleConn(cf(c))
}
return http.ListenAndServe(addr, http.HandlerFunc(ws.ServeHTTP))
}
// handleConn handles a listener connection
func (s *Server) handleConn(c codec.Codec) {
for {