May I know how I can make grpc calls from the react client?
Is there some sample I can refer to?
I found some examples like the following to use a proxy but not sure how to go about it - for REST we'll call the endpoints, how do we do the same for grpc?
service Node {
// Client sends a stream of ClientMsg, server responds with a stream of ServerMsg
rpc MessageLoop(stream ClientMsg) returns (stream ServerMsg) {}
}Apologies that I'm a bit loss and likely asking silly questions. Earlier, a senior colleague was working on this project and I'm taking over.I understand that we have the option of using grpc with this project. The README in the server's pbx folder says:Tinode gRPC clients must implement rpc service `Node`, Tinode plugins `Plugin`.I open the pbx/model.proto file and the Node service definition is specified as :service Node {
// Client sends a stream of ClientMsg, server responds with a stream of ServerMsg
rpc MessageLoop(stream ClientMsg) returns (stream ServerMsg) {}
}I guess my question is how do I implement this bi-directional grpc service on the client side - with my client being a React app?
package main
import (
"context"
"fmt"
"log"
"github.com/tinode/chat/pbx"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
func main() {
crtFile := "/home/yogesnsamy/Coding/MHub/prod_cert/cert.crt"
creds, err := credentials.NewClientTLSFromFile(crtFile, "")
if err != nil {
log.Fatal("Error loading cert", err)
}
conn, err := grpc.Dial("dev.mhub.my:16060", grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatal("Error dialing", err)
}
c := pbx.NewNodeClient(conn)
response, err := c.MessageLoop(context.Background())
if err != nil {
log.Fatal("Error calling: ", err)
}
hi := &pbx.ClientHi{}
hi.Id = "1"
hi.UserAgent = "Golang_Spider_Bot/3.0"
hi.Ver = "0.15"
hi.Lang = "EN"
msgHi := &pbx.ClientMsg_Hi{Hi: hi}
clientMessage := &pbx.ClientMsg{Message: msgHi}
err = response.Send(clientMessage)
if err != nil {
log.Fatal("error sending message ", err)
}
// LOGIN as Admin user
// NOTE: you will need to create an admin user account
// Upgrade an existing user to have admin access
login := &pbx.ClientLogin{}
login.Id = "2"
login.Scheme = "basic"
login.Secret = []byte("alice:alice123") // normal user is also able to create a group
clMsg := &pbx.ClientMsg_Login{Login: login}
clientMessage = &pbx.ClientMsg{Message: clMsg}
err = response.Send(clientMessage)
if err != nil {
log.Fatal("error sending message ", err)
}
serverMsg, err := response.Recv()
if err != nil {
log.Fatal(err)
}
// log.Println("SERVER MESSAGE 1", serverMsg)
serverMsg, err = response.Recv()
if err != nil {
log.Fatal(err)
}
clientSub := &pbx.ClientSub{
Id: "3",
Topic: "new123457",
SetQuery: &pbx.SetQuery{
Desc: &pbx.SetDesc{
Public: []byte(`{"fn":"BUYER GROUP"}`),
DefaultAcs: &pbx.DefaultAcsMode{
// Auth: "N",
Auth: "JRWS",
},
},
},
}
clSub := &pbx.ClientMsg_Sub{Sub: clientSub}
subMessage := &pbx.ClientMsg{
Message: clSub,
}
err = response.Send(subMessage)
if err != nil {
log.Fatal(err)
}
serverMsg, err = response.Recv()
if err != nil {
log.Fatal(err)
}
code := serverMsg.GetCtrl().Code
if code == 200 {
topic := serverMsg.GetCtrl().Topic
clientPub := &pbx.ClientPub{
Topic: topic, // "grpfN-i3C3zBWo",
Content: []byte("\"Welcome to MHub Chat!\""),
}
clPub := &pbx.ClientMsg_Pub{Pub: clientPub}
pubMessage := &pbx.ClientMsg{
Message: clPub,
// Note: change this to an existing user
// OnBehalfOf: "usrRpP-hz3gYmw", // alice
}
err = response.Send(pubMessage)
if err != nil {
log.Fatal(err)
}
serverMsg, err = response.Recv()
if err != nil {
log.Fatal(err)
}
log.Println("SERVER MESSAGE 4", serverMsg)
// usrulvFt3MUeRw // bob
// usr3fsC5QpNu8U // mhub dickson
// usrAx7bwUjCZvw // gamuda user
userID := []string{"usrulvFt3MUeRw", "usr3fsC5QpNu8U", "usrAx7bwUjCZvw"}
for i, s := range userID {
fmt.Println(s)
clientSet := &pbx.ClientSet{
Topic: topic,
Query: &pbx.SetQuery{
Sub: &pbx.SetSub{
UserId: s,
},
},
}
clSet := &pbx.ClientMsg_Set{Set: clientSet}
setMessage := &pbx.ClientMsg{
Message: clSet,
}
err = response.Send(setMessage)
if err != nil {
log.Fatal(err)
}
serverMsg, err = response.Recv()
if err != nil {
log.Fatal(err)
}
log.Println("SERVER MESSAGE ", i, serverMsg)
}
}
}