Description
For a bi-directional stream, I get the following generated code:
type Btcd_SubscribeTransactionsServer interface {
Send(*MempoolTransaction) error
Recv() (*SubscribeTransactionsRequest, error)
grpc.ServerStream
}
There is absolutely no documentation about the behavior of these methods. They should either be documented in the code, or have a link to a page with documentation about them.
The "Go Basics" documentation merely gives the following example code:
func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
for {
in, err := stream.Recv()
if err == io.EOF {
return nil
}
if err != nil {
return err
}
key := serialize(in.Location)
... // look for notes to be sent to client
for _, note := range s.routeNotes[key] {
if err := stream.Send(note); err != nil {
return err
}
}
}
}
It seems that it's impossible to get a channel for incoming messages. But it's also not clear if Recv
is a blocking call. Does io.EOF
mean that the client closed that channel or that there is currently nothing to be read?
UPDATE:
Implementations for streams are modified to use generics #7057, which will cause the gRPC codegen to use prebuilt generic types to implement client and server stream objects, rather than generating new types and implementations for every RPC method. We need to make sure the stream interfaces using generics are well documented. Here are the high level tasks for completion
- Add documenation for stream interfaces - grpc: add docs for generic stream interfaces #7470
- Delete the code to generate stream interfaces for client and server.
- update the grpc.io docs to use generics instead of generated interfaces.