1package server
2
3import (
4	"fmt"
5	"io"
6	"math/rand"
7	"strings"
8	"time"
9
10	"github.com/ktr0731/grpc-test/api"
11	"google.golang.org/grpc/metadata"
12)
13
14func init() {
15	rand.Seed(time.Now().UnixNano())
16}
17
18func (s *ExampleService) ClientStreaming(stm api.Example_ClientStreamingServer) error {
19	var t int
20	var names []string
21	stm.SendHeader(metadata.New(map[string]string{"header_key1": "header_val1", "header_key2": "header_val2"}))
22	stm.SetTrailer(metadata.New(map[string]string{"trailer_key1": "trailer_val1", "trailer_key2": "trailer_val2"}))
23	for {
24		req, err := stm.Recv()
25		if err == io.EOF {
26			s.Logger.Println("end of client streaming")
27			return stm.SendAndClose(&api.SimpleResponse{
28				Message: fmt.Sprintf(`you sent requests %d times (%s).`, t, strings.Join(names, ", ")),
29			})
30		}
31		if err != nil {
32			return err
33		}
34		names = append(names, req.GetName())
35		t++
36		s.Logger.Println("client streaming request received")
37	}
38	return nil
39}
40
41func (s *ExampleService) ServerStreaming(req *api.SimpleRequest, stm api.Example_ServerStreamingServer) error {
42	defer s.Logger.Println("end of server streaming")
43	if err := stm.SendHeader(metadata.New(map[string]string{"ss_header_key1": "header_val1", "ss_header_key2": "header_val2"})); err != nil {
44		return err
45	}
46	stm.SetTrailer(metadata.New(map[string]string{"ss_trailer_key1": "trailer_val1", "ss_trailer_key2": "trailer_val2"}))
47	if err := s.serverStreaming(req, stm); err != nil {
48		return err
49	}
50	return nil
51}
52
53func (s *ExampleService) serverStreaming(req *api.SimpleRequest, stm api.Example_ServerStreamingServer) error {
54	n := 3
55	s.Logger.Printf("send %d times\n", n)
56	for i := 0; i < n; i++ {
57		s.Logger.Printf("send %d\n", i+1)
58		err := stm.Send(&api.SimpleResponse{
59			Message: fmt.Sprintf(`hello %s, I greet %d times.`, req.GetName(), i+1),
60		})
61		if err != nil {
62			return err
63		}
64		time.Sleep(50 * time.Millisecond)
65	}
66	return nil
67}
68
69func (s *ExampleService) BidiStreaming(stm api.Example_BidiStreamingServer) error {
70	if err := stm.SendHeader(metadata.New(map[string]string{"header_key1": "header_val1", "header_key2": "header_val2"})); err != nil {
71		return err
72	}
73	stm.SetTrailer(metadata.New(map[string]string{"trailer_key1": "trailer_val1", "trailer_key2": "trailer_val2"}))
74	for {
75		req, err := stm.Recv()
76		if err == io.EOF {
77			return nil
78		}
79		if err != nil {
80			return err
81		}
82
83		if err := s.serverStreaming(req, stm); err != nil {
84			return err
85		}
86	}
87}
88