From 8566db96b09402facd7f7020a68f31c44a24ef76 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 1 Mar 2022 16:39:36 +0800 Subject: [PATCH] [add] Socket client mode support & fix watch bug --- cmd/start.go | 17 +++++--- data/bindata.go | 60 ++++++++++++++--------------- server/socket.go | 2 +- server/socket_test.go | 4 +- share/watch.go | 27 ++++--------- share/watch_test.go | 3 -- tests/servers/rfid.sock.json | 11 ++++-- tests/servers/rfid_client.sock.json | 12 ++++++ 8 files changed, 71 insertions(+), 65 deletions(-) create mode 100644 tests/servers/rfid_client.sock.json diff --git a/cmd/start.go b/cmd/start.go index a6667c66..278f597e 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -88,15 +88,20 @@ var startCmd = &cobra.Command{ service.Watch(config.Conf) } - // 启用内测功能 + // with the alpha features if startAlpha { - for _, srv := range gou.Servers { + for _, sock := range gou.Sockets { fmt.Println(color.WhiteString("\n---------------------------------")) - fmt.Println(color.WhiteString(srv.Name)) + fmt.Println(color.WhiteString(sock.Name)) fmt.Println(color.WhiteString("---------------------------------")) - fmt.Println(color.GreenString("Host: %s://%s", srv.Protocol, srv.Host)) - fmt.Println(color.GreenString("Port: %s\n\n", srv.Port)) - go srv.Start() + fmt.Println(color.GreenString("Mode: %s", sock.Mode)) + fmt.Println(color.GreenString("Host: %s://%s", sock.Protocol, sock.Host)) + fmt.Println(color.GreenString("Port: %s\n\n", sock.Port)) + if sock.Mode == "server" { + go sock.Start() + } else if sock.Mode == "client" { + go sock.Connect() + } } } diff --git a/data/bindata.go b/data/bindata.go index e6284483..307356b6 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -208,7 +208,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 22, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 22, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -228,7 +228,7 @@ func yaoDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -248,7 +248,7 @@ func yaoApisReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/README.md", size: 13, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/README.md", size: 13, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -268,7 +268,7 @@ func yaoApisChartHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/chart.http.json", size: 624, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/chart.http.json", size: 624, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -288,7 +288,7 @@ func yaoApisImportHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/import.http.json", size: 1676, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/import.http.json", size: 1676, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -308,7 +308,7 @@ func yaoApisPageHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/page.http.json", size: 609, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/page.http.json", size: 609, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -328,7 +328,7 @@ func yaoApisStorageHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/storage.http.json", size: 1092, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/storage.http.json", size: 1092, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -348,7 +348,7 @@ func yaoApisTableHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/table.http.json", size: 3196, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/table.http.json", size: 3196, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -368,7 +368,7 @@ func yaoApisUserHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/user.http.json", size: 1453, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/user.http.json", size: 1453, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -388,7 +388,7 @@ func yaoApisXiangHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/xiang.http.json", size: 1239, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/apis/xiang.http.json", size: 1239, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -408,7 +408,7 @@ func yaoDataDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -428,7 +428,7 @@ func yaoDataAppJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/app.json", size: 277, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/app.json", size: 277, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -448,7 +448,7 @@ func yaoDataIconsDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/icons/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -468,7 +468,7 @@ func yaoDataIcons404Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -488,7 +488,7 @@ func yaoDataIconsIconIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -508,7 +508,7 @@ func yaoDataIconsIconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -528,7 +528,7 @@ func yaoDataIconsIconPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -548,7 +548,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -568,7 +568,7 @@ func yaoFlowsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/README.md", size: 12, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/flows/README.md", size: 12, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -588,7 +588,7 @@ func yaoFlowsAdminGuardFlowJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/admin/guard.flow.json", size: 559, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/flows/admin/guard.flow.json", size: 559, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -608,7 +608,7 @@ func yaoFlowsMenuFlowJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/menu.flow.json", size: 1045, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/flows/menu.flow.json", size: 1045, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -628,7 +628,7 @@ func yaoFlowsUserFindFlowJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/user/find.flow.json", size: 328, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/flows/user/find.flow.json", size: 328, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -648,7 +648,7 @@ func yaoLangsEnUsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -668,7 +668,7 @@ func yaoModelsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/models/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -688,7 +688,7 @@ func yaoModelsMenuModJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/menu.mod.json", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/models/menu.mod.json", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -708,7 +708,7 @@ func yaoModelsUserModJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user.mod.json", size: 8826, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.json", size: 8826, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -728,7 +728,7 @@ func yaoModelsWorkflowModJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/workflow.mod.json", size: 3333, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/models/workflow.mod.json", size: 3333, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -748,7 +748,7 @@ func yaoTablesReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/tables/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/tables/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -768,7 +768,7 @@ func yaoTablesMenuTabJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/tables/menu.tab.json", size: 10471, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/tables/menu.tab.json", size: 10471, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -788,7 +788,7 @@ func yaoTablesUserTabJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/tables/user.tab.json", size: 2357, mode: os.FileMode(420), modTime: time.Unix(1645092418, 0)} + info := bindataFileInfo{name: "yao/tables/user.tab.json", size: 2357, mode: os.FileMode(420), modTime: time.Unix(1646123553, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/server/socket.go b/server/socket.go index 0ab88c5e..48b07ea0 100644 --- a/server/socket.go +++ b/server/socket.go @@ -26,7 +26,7 @@ func LoadFrom(dir string, prefix string) error { err := share.Walk(dir, ".sock.json", func(root, filename string) { name := prefix + share.SpecName(root, filename) content := share.ReadFile(filename) - _, err := gou.LoadServer(string(content), name) + _, err := gou.LoadSocket(string(content), name) if err != nil { log.With(log.F{"root": root, "file": filename}).Error(err.Error()) } diff --git a/server/socket_test.go b/server/socket_test.go index 65f8d361..f86a5a47 100644 --- a/server/socket_test.go +++ b/server/socket_test.go @@ -16,8 +16,8 @@ func TestLoad(t *testing.T) { func check(t *testing.T) { keys := []string{} - for key := range gou.Servers { + for key := range gou.Sockets { keys = append(keys, key) } - assert.Equal(t, 1, len(keys)) + assert.Equal(t, 2, len(keys)) } diff --git a/share/watch.go b/share/watch.go index 41a13ac2..9d25802f 100644 --- a/share/watch.go +++ b/share/watch.go @@ -6,13 +6,14 @@ import ( "log" "os" "path/filepath" + "sync" "github.com/fatih/color" "github.com/fsnotify/fsnotify" "github.com/yaoapp/kun/exception" ) -var watchDone = []chan bool{} +var watchGroup sync.WaitGroup var watchOp = map[fsnotify.Op]string{ fsnotify.Create: "create", fsnotify.Write: "write", @@ -27,10 +28,12 @@ func Watch(root string, cb func(op string, file string)) { if err != nil { log.Fatal(err) } - defer watcher.Close() + defer func() { + watcher.Close() + watchGroup.Done() + }() - watchDone = append(watchDone, make(chan bool)) - last := len(watchDone) - 1 + watchGroup.Add(1) go func() { for { select { @@ -86,20 +89,6 @@ func Watch(root string, cb func(op string, file string)) { return nil }) - select { - case v := <-watchDone[last]: - fmt.Println(color.GreenString("Stop Watching: %s", root)) - if v == true { - break - } - } -} + watchGroup.Wait() -// StopWatch 停止监听 -func StopWatch() { - for i := range watchDone { - fmt.Println(color.GreenString("Stop: %d", i)) - watchDone[i] <- true - } - watchDone = []chan bool{} } diff --git a/share/watch_test.go b/share/watch_test.go index bc6e49e6..e05fff00 100644 --- a/share/watch_test.go +++ b/share/watch_test.go @@ -5,7 +5,6 @@ import ( "os" "path" "testing" - "time" "github.com/stretchr/testify/assert" ) @@ -16,7 +15,5 @@ func TestWatch(t *testing.T) { go Watch(root, func(op string, file string) { log.Println(op, file) }) - time.Sleep(time.Second * 2) - defer StopWatch() }) } diff --git a/tests/servers/rfid.sock.json b/tests/servers/rfid.sock.json index 7f908a77..e2716f16 100644 --- a/tests/servers/rfid.sock.json +++ b/tests/servers/rfid.sock.json @@ -1,9 +1,12 @@ { - "name": "RFID接收器", - "description": "用来接收并处理RIFD", - "version": "0.0.1", + "name": "RFID Receiver (Server Mode)", + "description": "RFID Receiver (Server Mode)", + "mode": "server", + "version": "0.9.2", "protocol": "tcp", "host": "0.0.0.0", "port": "3019", - "process": "flows.rfid.read" + "process": "flows.rfid.read", + "buffer": 60, + "keep": 0 } diff --git a/tests/servers/rfid_client.sock.json b/tests/servers/rfid_client.sock.json new file mode 100644 index 00000000..7889de6e --- /dev/null +++ b/tests/servers/rfid_client.sock.json @@ -0,0 +1,12 @@ +{ + "name": "RFID Receiver (Client Mode)", + "description": "RFID Receiver (Client Mode)", + "mode": "client", + "version": "0.9.2", + "protocol": "tcp", + "host": "192.168.1.192", + "port": "6000", + "process": "flows.rfid.read", + "buffer": 60, + "keep": 0 +}