diff --git a/server/gwrpc.go b/server/gwrpc.go index 1456a0e..f9b1764 100644 --- a/server/gwrpc.go +++ b/server/gwrpc.go @@ -3,16 +3,22 @@ package server import ( "flag" pb "git.loafle.net/overflow/overflow_api_service/grpc" + ws "git.loafle.net/overflow/overflow_api_service/ws" "github.com/golang/glog" "github.com/grpc-ecosystem/grpc-gateway/runtime" "golang.org/x/net/context" "google.golang.org/grpc" "net/http" "strings" + "github.com/tmc/grpc-websocket-proxy/wsproxy" + "log" + "net" ) var ( overflowEndpoint = flag.String("echo_endpoint", ":9090", "/v1/overflow/services") + grpcAddr = flag.String("grpcaddr", ":8001", "listen grpc addr") + httpAddr = flag.String("addr", ":8000", "listen http addr") ) func RunGwRpc() (err error) { @@ -20,16 +26,42 @@ func RunGwRpc() (err error) { ctx, cancel := context.WithCancel(ctx) defer cancel() + if err := listenGRPC(*grpcAddr); err != nil { + return err + } + mux := runtime.NewServeMux() opts := []grpc.DialOption{grpc.WithInsecure()} err = pb.RegisterOverflowGatewayHandlerFromEndpoint(ctx, mux, *overflowEndpoint, opts) + if err != nil { + return err + } + err = ws.RegisterWebSocketServiceHandlerFromEndpoint(ctx, mux, *grpcAddr, opts) if err != nil { return err } + http.ListenAndServe(*httpAddr, wsproxy.WebsocketProxy(mux)) + + return http.ListenAndServe(":8080", wsproxy.WebsocketProxy(allowCORS(mux))) +} + +func listenGRPC(listenAddr string) error { + lis, err := net.Listen("tcp", listenAddr) + if err != nil { + return err + } + grpcServer := grpc.NewServer() + ws.RegisterWebSocketServiceServer(grpcServer, &Server{}) + + go func() { + if err := grpcServer.Serve(lis); err != nil { + log.Println("serveGRPC err:", err) + } + }() + return nil - return http.ListenAndServe(":8080", allowCORS(mux)) } //https://github.com/grpc-ecosystem/grpc-gateway/blob/master/examples/main.go diff --git a/server/ws_server.go b/server/ws_server.go new file mode 100644 index 0000000..52d71d2 --- /dev/null +++ b/server/ws_server.go @@ -0,0 +1,78 @@ +package server + +import ( + ws "git.loafle.net/overflow/overflow_api_service/ws" + "log" +) + +type Server struct{} + + +func (s *Server) Test(srv ws.WebSocketService_TestServer) error { + for { + req, err := srv.Recv() + if err != nil { + return err + } + + if req.GetMsgType() == "onConnection" { + onConnection(req) + } + + if err := srv.Send(&ws.WSResponse{ + Msg: req.Msg + "!", + }); err != nil { + return err + } + } +} + + +func onConnection(req *ws.WSRequest) { + log.Println("UserID: ", req.GetUserId()) +} + +// +//func (s *Server) Stream(_ *echoserver.Empty, stream echoserver.EchoService_StreamServer) error { +// start := time.Now() +// for i := 0; i < 5; i++ { +// time.Sleep(time.Second) +// if err := stream.Send(&echoserver.EchoResponse{ +// Message: "hello there!" + fmt.Sprint(time.Now().Sub(start)), +// }); err != nil { +// return err +// } +// } +// return nil +//} +// +// +//func (s *Server) Heartbeats(srv echoserver.EchoService_HeartbeatsServer) error { +// go func() { +// for { +// _, err := srv.Recv() +// if err != nil { +// log.Println("Recv() err:", err) +// return +// } +// log.Println("got hb from client") +// } +// }() +// t := time.NewTicker(time.Second * 1) +// for { +// log.Println("sending hb") +// hb := &echoserver.Heartbeat{ +// Status: echoserver.Heartbeat_OK, +// } +// b := new(bytes.Buffer) +// if err := (&jsonpb.Marshaler{}).Marshal(b, hb); err != nil { +// log.Println("marshal err:", err) +// } +// log.Println(string(b.Bytes())) +// if err := srv.Send(hb); err != nil { +// return err +// } +// <-t.C +// } +// return nil +//}