@@ -14,10 +14,10 @@ Current support:
1414
1515 - Transport protocol: TTHeader
1616 - IDL Definition Language and Serialization Protocol: Thrift
17- - ** gRPC Streaming** : ~~~~(planned implementation)
17+ - ** gRPC Streaming**
1818
19- - ~~ Transport protocol: gRPC~~
20- - ~~ IDL Definition Language and Serialization Protocol: Protobuf Encoding ~~
19+ - Transport protocol: gRPC
20+ - IDL Definition Language and Serialization Protocol: Thrift / Protobuf
2121
2222The protocol selected here only affects code generated from IDL. Regardless of the protocol, the following usage is consistent.
2323
@@ -44,11 +44,15 @@ service TestService {
4444```
4545
4646#### Generate code
47+ Please make sure that Kitex Tool has been upgraded to v0.13.0+:
48+ ```
49+ go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
50+ ```
4751
48- To maintain compatibility with legacy stream-generated code, Command Line needs to add ` the -streamx ` flag.
52+ To maintain compatibility with legacy stream-generated code, Command Line needs to add the ` -streamx ` flag.
4953
5054```
51- kitex -streamx -module <go module> -service P.S.M echo.thrift
55+ kitex -streamx -module <go module> -service service echo.thrift
5256```
5357
5458##### Initialization
@@ -57,25 +61,25 @@ kitex -streamx -module <go module> -service P.S.M echo.thrift
5761
5862``` go
5963import " .../kitex_gen/echo/testservice"
60- import " github.com/cloudwego/kitex/client/streamxclient "
64+ import " github.com/cloudwego/kitex/client"
6165
6266cli , err := testservice.NewClient (
6367 " a.b.c" ,
64- streamxclient .WithStreamRecvMiddleware (...),
65- streamxclient .WithStreamSendMiddleware (...),
68+ client .WithStreamRecvMiddleware (...),
69+ client .WithStreamSendMiddleware (...),
6670)
6771```
6872
6973#### Create Server
7074
7175``` go
72- import " .../kitex_gen/echo/streamserver "
73- import " github.com/cloudwego/kitex/server/streamxserver "
76+ import " .../kitex_gen/echo/testservice "
77+ import " github.com/cloudwego/kitex/server"
7478
75- svr := streamserver .NewServer (
79+ svr := testservice .NewServer (
7680 new (serviceImpl),
77- streamxserver .WithStreamRecvMiddleware (...),
78- streamxserver .WithStreamSendMiddleware (...),
81+ server .WithStreamRecvMiddleware (...),
82+ server .WithStreamSendMiddleware (...),
7983)
8084```
8185
@@ -101,14 +105,14 @@ client.CloseAndRecv(res) === EOF ==> server.Recv(EOF)
101105
102106#### Client Usage
103107
104- - [ ** Must** ] : The client must call the CloseAndRecv () or (CloseSend + Recv) method to inform the server that there is no new data to send.
108+ - [ ** Must** ] : The client must call the CloseAndRecv() or (CloseSend + Recv) method to inform the server that there is no new data to send.
105109
106110``` go
107- ctx , cs , err := cli.ClientStream (ctx)
111+ stream , err := cli.EchoClient (ctx)
108112for i := 0 ; i < 3 ; i++ {
109- err = cs .Send (ctx , req)
113+ err = stream .Send (stream. Context () , req)
110114}
111- res, err = cs .CloseAndRecv (ctx )
115+ res, err = stream .CloseAndRecv (stream. Context () )
112116```
113117
114118#### Server usage
@@ -117,14 +121,14 @@ res, err = cs.CloseAndRecv(ctx)
117121
118122``` go
119123
120- func (si *serviceImpl ) ClientStream (
121- ctx context.Context, stream streamx.ClientStreamingServer[Request, Response]
122- ) (res *Response, err error) {
124+ func (si *serviceImpl ) EchoClient (
125+ ctx context.Context, stream echo.TestService_EchoClientServer
126+ ) (err error) {
123127 for {
124128 req , err := stream.Recv (ctx)
125129 if err == io.EOF {
126130 res := new (Response)
127- return res, nil
131+ return stream. SendAndClose (ctx, res)
128132 }
129133 if err != nil {
130134 return nil , err
@@ -153,12 +157,12 @@ client.Recv(EOF) <== EOF === server handler return
153157
154158#### Client Usage
155159
156- - [ ** Must** ] : The client must check the io. EOF error and end the loop
160+ - [ ** Must** ] : The client must check the io.EOF error and end the loop
157161
158162``` go
159- ctx , ss , err := cli.ServerStream (ctx, req)
163+ stream , err := cli.EchoServer (ctx, req)
160164for {
161- res , err := ss .Recv (ctx )
165+ res , err := stream .Recv (stream. Context () )
162166 if errors.Is (err, io.EOF ) {
163167 break
164168 }
@@ -168,7 +172,7 @@ for {
168172#### Server usage
169173
170174``` go
171- func (si *serviceImpl ) ServerStream (ctx context .Context , req *Request , stream streamx . ServerStreamingServer [ Response ] ) error {
175+ func (si *serviceImpl ) EchoServer (ctx context .Context , req *echo . Request , stream echo . TestService_EchoServerServer ) error {
172176 for i := 0 ; i < 3 ; i++ {
173177 err := stream.Send (ctx, resp)
174178 if err != nil {
@@ -204,23 +208,23 @@ client.Recv(EOF) <== EOF === server handler return
204208#### Client Usage
205209
206210- [ ** Must** ] : client must call CloseSend after sending
207- - [ ** Must** ] : client must judge io. EOF and end the loop when Recv
211+ - [ ** Must** ] : client must judge io.EOF and end the loop when Recv
208212
209213``` go
210- ctx , bs , err := cli.BidiStream (ctx)
214+ stream , err := cli.EchoBidi (ctx)
211215var wg sync.WaitGroup
212216wg.Add (2 )
213217go func () {
214218 defer wg.Done ()
215219 for i := 0 ; i < round; i++ {
216- err := bs .Send (ctx , req)
220+ err := stream .Send (stream. Context () , req)
217221 }
218- err = bs .CloseSend (ctx )
222+ err = stream .CloseSend (stream. Context () )
219223}()
220224go func () {
221225 defer wg.Done ()
222226 for {
223- res , err := bs .Recv (ctx )
227+ res , err := stream .Recv (stream. Context () )
224228 if errors.Is (err, io.EOF ) {
225229 break
226230 }
@@ -234,7 +238,7 @@ wg.Wait()
234238- [ ** Must** ] : The server must determine io. EOF and end the loop when Recv
235239
236240``` go
237- func (si *serviceImpl ) BidiStream (ctx context .Context , stream streamx . BidiStreamingServer [ Request , Response ] ) error {
241+ func (si *serviceImpl ) EchoBidi (ctx context .Context , stream echo . TestService_EchoBidiServer ) error {
238242 for {
239243 req , err := stream.Recv (ctx)
240244 if err == io.EOF {
0 commit comments