diff --git a/OneBlogService b/OneBlogService deleted file mode 100755 index 3067ea0..0000000 Binary files a/OneBlogService and /dev/null differ diff --git a/chatroom/README.md b/chatroom/README.md index d80c52f..ddda3a7 100644 --- a/chatroom/README.md +++ b/chatroom/README.md @@ -1,5 +1,9 @@ ## ChartRoom +## 基于tcp的聊天室 + +- 如果大量用户广播延迟问题 +- 消息的堵塞 ```md ├── chatroom diff --git a/chatroom/cmd/tcp/client/client_test.go b/chatroom/cmd/tcp/client/client_test.go new file mode 100644 index 0000000..7d94f6c --- /dev/null +++ b/chatroom/cmd/tcp/client/client_test.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "io" + "log" + "net" + "strings" + "testing" + "time" +) + +func TestSendMsg(t *testing.T) { + + for i := 0; i < 100; i++ { + + go func(i int) { + conn, err := net.Dial("tcp", ":2020") + if err != nil { + panic(err) + } + for j := 0; j < 1000; j++ { + time.Sleep(time.Microsecond * 500) + s := strings.NewReader(fmt.Sprintf("%s%d\n", "hello", i)) + if _, err := io.Copy(conn, s); err != nil { + log.Fatal(err) + } + } + }(i) + } + time.Sleep(time.Second * 10) + log.Println("done") +} diff --git a/chatroom/cmd/tcp/server.go b/chatroom/cmd/tcp/server/server.go similarity index 73% rename from chatroom/cmd/tcp/server.go rename to chatroom/cmd/tcp/server/server.go index fd8eb0e..4f30eda 100644 --- a/chatroom/cmd/tcp/server.go +++ b/chatroom/cmd/tcp/server/server.go @@ -11,9 +11,13 @@ import ( ) var ( - enteringChannel = make(chan *User) - leavingChannel = make(chan *User) - messageChannel = make(chan string, 8) + // 用户列表 + enteringChannel = make(chan *User) + // 用户离开 + leavingChannel = make(chan *User) + // messageChannel 缓冲区的大小是 8,这意味着 channel 可以存储最多 8 个字符串元素 + messageChannel = make(chan string, 2) + // 增长id userIdListChannel = make(chan int, 1) ) @@ -40,16 +44,24 @@ func main() { } func broadcaster() { + usersMap := make(map[*User]struct{}) + i := 0 for { + select { case user := <-enteringChannel: usersMap[user] = struct{}{} case user := <-leavingChannel: delete(usersMap, user) close(user.MessageChannel) - case msg := <-messageChannel: - for user := range usersMap { + //缓冲区的大小是 8,这意味着最多可以存储 8 条消息。 + //如果缓冲区已满,新的消息将会被阻塞, + //直到有一个接收操作从 channel 中读取一个消息。 + case msg := <-messageChannel: //channel 空间限制住了 + i++ + msg = msg + "_" + fmt.Sprint(i) + for user := range usersMap { //这里如果没有用户太多 user.MessageChannel <- msg } } diff --git a/chatroom/cmd/tcp/server/server_test.go b/chatroom/cmd/tcp/server/server_test.go new file mode 100644 index 0000000..39d4b62 --- /dev/null +++ b/chatroom/cmd/tcp/server/server_test.go @@ -0,0 +1,106 @@ +package main + +import ( + "fmt" + "net" + "sync" + "testing" + "time" +) + +func BenchmarkBroadcaster(b *testing.B) { + listener, err := net.Listen("tcp", ":0") + if err != nil { + b.Fatal(err) + } + defer listener.Close() + + // 启动广播器 + go broadcaster() + + // 启动客户端 + var wg sync.WaitGroup + for i := 0; i < b.N; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + conn, err := net.Dial("tcp", listener.Addr().String()) + if err != nil { + b.Fatal(err) + } + defer conn.Close() + + // 发送消息到服务器 + fmt.Fprintf(conn, "Hello, %d\n", i) + + // 读取服务器发回的消息 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + b.Fatal(err) + } + msg := string(buf[:n]) + + // 检查消息是否正确 + expect := fmt.Sprintf("Hello, %d\n", i) + if msg != expect { + b.Errorf("expect %q, but got %q", expect, msg) + } + conn.Close() + }() + } + + // 等待所有客户端完成测试 + wg.Wait() + listener.Close() +} + +func TestBroadcasterWithBlocking(t *testing.T) { + listener, err := net.Listen("tcp", ":0") + if err != nil { + t.Fatal(err) + } + defer listener.Close() + + // 启动广播器 + go broadcaster() + + // 启动客户端 + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func(id int) { + defer wg.Done() + + conn, err := net.Dial("tcp", listener.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer conn.Close() + + // 模拟消息延迟和阻塞 + time.Sleep(5 * time.Second) + + // 发送消息到服务器 + fmt.Fprintf(conn, "Hello, %d\n", id) + + // 读取服务器发回的消息 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + t.Fatal(err) + } + msg := string(buf[:n]) + + // 检查消息是否正确 + expect := fmt.Sprintf("Hello, %d\n", id) + if msg != expect { + t.Errorf("expect %q, but got %q", expect, msg) + } + }(i) + } + + // 等待所有客户端完成测试 + wg.Wait() +} diff --git a/chatroom/cmd/websocket/nhooyr/client/client.go b/chatroom/cmd/websocket/nhooyr/client/client.go new file mode 100644 index 0000000..31babab --- /dev/null +++ b/chatroom/cmd/websocket/nhooyr/client/client.go @@ -0,0 +1,34 @@ +package main + +import ( + "context" + "log" + "time" + + "nhooyr.io/websocket" + "nhooyr.io/websocket/wsjson" +) + +func main() { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + c, _, err := websocket.Dial(ctx, "ws://localhost:2021/ws", nil) + if err != nil { + panic(err) + } + defer c.Close(websocket.StatusInternalError, "server eroor") + + err = wsjson.Write(ctx, c, "Hello WebSocket server") + if err != nil { + panic(err) + } + var v any + err = wsjson.Read(ctx, c, &v) + if err != nil { + panic(err) + } + log.Printf("recv: %v", v) + c.Close(websocket.StatusNormalClosure, "") + +} diff --git a/chatroom/cmd/websocket/nhooyr/server/server.go b/chatroom/cmd/websocket/nhooyr/server/server.go new file mode 100644 index 0000000..aeb099b --- /dev/null +++ b/chatroom/cmd/websocket/nhooyr/server/server.go @@ -0,0 +1,44 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "time" + + "nhooyr.io/websocket" + "nhooyr.io/websocket/wsjson" +) + +func main() { + http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + fmt.Fprintln(w, "HTTP , Hello") + }) + http.HandleFunc("/ws", func(w http.ResponseWriter, req *http.Request) { + conn, err := websocket.Accept(w, req, nil) + if err != nil { + log.Println(err) + return + } + defer conn.Close(websocket.StatusInternalError, "servr error") + ctx, cancel := context.WithTimeout(req.Context(), time.Second*10) + defer cancel() + + var v any + err = wsjson.Read(ctx, conn, &v) + if err != nil { + log.Println(err) + return + } + log.Printf("recv: %v", v) + err = wsjson.Write(ctx, conn, "Hello WebSocket clinet") + if err != nil { + log.Println(err) + return + } + + conn.Close(websocket.StatusNormalClosure, "200") + }) + log.Fatal(http.ListenAndServe(":2021", nil)) +} diff --git a/client/client_test.go b/client/client_test.go new file mode 100644 index 0000000..92d2448 --- /dev/null +++ b/client/client_test.go @@ -0,0 +1,9 @@ +package main + +import ( + "testing" +) + +func TestGetClientConn(t *testing.T) { + main() +} diff --git a/client/test/clinet_test.go b/client/test/clinet_test.go new file mode 100644 index 0000000..9e16aea --- /dev/null +++ b/client/test/clinet_test.go @@ -0,0 +1,37 @@ +package test + +import ( + "context" + "fmt" + "log" + "testing" + + "github.com/lc-1010/OneBlogService/global" + "github.com/lc-1010/OneBlogService/pkg/tracer" +) + +func TestTacer(t *testing.T) { + TSpan() +} + +type b string + +func TSpan() { + + tracerPorvider, err := tracer.NewJaegerTrancer( + "cligrpc", + "127.0.0.1", + "6831", + ) + if err != nil { + log.Fatal(err) + } + global.Tracer = tracerPorvider + + ctx := context.Background() + tr := global.Tracer.Tracer("test11") + pp := context.WithValue(ctx, b("ba"), b("j")) + _, span := tr.Start(pp, "cli-rpc") + defer span.End() + fmt.Println("ok tracer") +} diff --git a/go.mod b/go.mod index e8354ab..62f8753 100644 --- a/go.mod +++ b/go.mod @@ -48,6 +48,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect + github.com/klauspost/compress v1.10.3 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/prometheus/client_golang v1.11.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect @@ -117,6 +118,7 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/plugin/opentelemetry v0.1.3 + nhooyr.io/websocket v1.8.7 ) replace google.golang.org/grpc => google.golang.org/grpc v1.52.3 diff --git a/go.sum b/go.sum index abb235c..4eedc91 100644 --- a/go.sum +++ b/go.sum @@ -369,6 +369,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -424,6 +426,7 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -454,18 +457,28 @@ github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -568,6 +581,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= @@ -591,6 +606,7 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -603,6 +619,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -617,6 +635,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -626,6 +645,7 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= @@ -715,6 +735,8 @@ github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg= github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= @@ -935,6 +957,7 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1322,6 +1345,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=