From deb6ba9135e89cba56c531a2ca8b39fa7ac2058e Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 4 Mar 2022 21:43:19 +0800 Subject: [PATCH] [add] WebSocket support --- api/api.go | 11 +++++++++++ api/api_test.go | 8 ++++++++ cmd/start.go | 8 ++++++++ flow/flow_test.go | 2 +- go.sum | 2 ++ service/middleware.go | 3 ++- tests/apis/chat.ws.json | 11 +++++++++++ tests/flows/websocket/chat.flow.json | 7 +++++++ tests/scripts/websocket.js | 5 +++++ 9 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 tests/apis/chat.ws.json create mode 100644 tests/flows/websocket/chat.flow.json create mode 100644 tests/scripts/websocket.js diff --git a/api/api.go b/api/api.go index 5af1c70c..7da8627c 100644 --- a/api/api.go +++ b/api/api.go @@ -31,6 +31,17 @@ func LoadFrom(dir string, prefix string) error { log.With(log.F{"root": root, "file": filename}).Error(err.Error()) } }) + + // Load WebSocket Server + err = share.Walk(dir, ".ws.json", func(root, filename string) { + name := prefix + share.SpecName(root, filename) + content := share.ReadFile(filename) + _, err := gou.LoadWebSocket(string(content), name) + if err != nil { + log.With(log.F{"root": root, "file": filename}).Error(err.Error()) + } + }) + return err } diff --git a/api/api_test.go b/api/api_test.go index 1fcb35b3..79f8cf18 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -5,6 +5,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/yaoapp/gou" + "github.com/yaoapp/gou/websocket" "github.com/yaoapp/yao/config" ) @@ -20,5 +21,12 @@ func check(t *testing.T) { for key := range gou.APIs { keys = append(keys, key) } + + wskeys := []string{} + for key := range websocket.Upgraders { + wskeys = append(wskeys, key) + } + assert.Equal(t, 4, len(keys)) + assert.Equal(t, 1, len(wskeys)) } diff --git a/cmd/start.go b/cmd/start.go index 278f597e..9395e44c 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -9,6 +9,7 @@ import ( "github.com/fatih/color" "github.com/spf13/cobra" "github.com/yaoapp/gou" + "github.com/yaoapp/gou/websocket" "github.com/yaoapp/yao/config" "github.com/yaoapp/yao/engine" "github.com/yaoapp/yao/service" @@ -63,7 +64,14 @@ var startCmd = &cobra.Command{ color.WhiteString(filepath.Join("/api", api.HTTP.Group, p.Path)), "\tprocess:", p.Process) } + } + fmt.Printf(color.CyanString("\n%s(%d)\n", "WebSocket", len(websocket.Upgraders))) + for name, upgrader := range websocket.Upgraders { // WebSocket + fmt.Println( + colorMehtod("GET"), + color.WhiteString(filepath.Join("/websocket", name)), + "\tprocess:", upgrader.Process) } } diff --git a/flow/flow_test.go b/flow/flow_test.go index 79f13836..394da9b4 100644 --- a/flow/flow_test.go +++ b/flow/flow_test.go @@ -20,5 +20,5 @@ func check(t *testing.T) { for key := range gou.Flows { keys = append(keys, key) } - assert.Equal(t, 23, len(keys)) + assert.Equal(t, 24, len(keys)) } diff --git a/go.sum b/go.sum index 971128fe..fe8aee73 100644 --- a/go.sum +++ b/go.sum @@ -223,6 +223,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= diff --git a/service/middleware.go b/service/middleware.go index ed2e746b..fe98f2f6 100644 --- a/service/middleware.go +++ b/service/middleware.go @@ -27,7 +27,8 @@ func BinStatic(c *gin.Context) { length := len(c.Request.URL.Path) - if length >= 5 && c.Request.URL.Path[0:5] == "/api/" { // API接口 + if (length >= 5 && c.Request.URL.Path[0:5] == "/api/") || + (length >= 11 && c.Request.URL.Path[0:11] == "/websocket/") { // API & websocket c.Next() return } else if length >= 7 && c.Request.URL.Path[0:7] == "/xiang/" { // 数据管理后台 diff --git a/tests/apis/chat.ws.json b/tests/apis/chat.ws.json new file mode 100644 index 00000000..eb94daed --- /dev/null +++ b/tests/apis/chat.ws.json @@ -0,0 +1,11 @@ +{ + "name": "A Chat WebSocket server", + "description": "A Chat WebSocket serverr", + "version": "0.9.2", + "protocols": ["yao-chat-01"], + "guard": "bearer-jwt", + "buffer": { "read": 1024, "write": 1024 }, + "limit": { "read-wait": 10, "pong-wait": 20, "max-message": 1024 }, + "timeout": 5, + "process": "flows.websocket.chat" +} diff --git a/tests/flows/websocket/chat.flow.json b/tests/flows/websocket/chat.flow.json new file mode 100644 index 00000000..e1dedde2 --- /dev/null +++ b/tests/flows/websocket/chat.flow.json @@ -0,0 +1,7 @@ +{ + "label": "a chat Websocket process", + "version": "1.0.0", + "description": "a chat Websocket process", + "nodes": [], + "output": "{{$in.0}}" +} diff --git a/tests/scripts/websocket.js b/tests/scripts/websocket.js new file mode 100644 index 00000000..557929e3 --- /dev/null +++ b/tests/scripts/websocket.js @@ -0,0 +1,5 @@ +function Hello() { + var ws = new WebSocket("ws://127.0.0.1:5093/websocket/chat", "p0"); + var response = ws.push("Hello World"); + return response; +}