-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver_clientstreaming.go
More file actions
36 lines (31 loc) · 1.04 KB
/
server_clientstreaming.go
File metadata and controls
36 lines (31 loc) · 1.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package sidecar
import (
"context"
"io"
"net/http"
)
// ClientStream provides messaging to client streaming handlers.
type ClientStream[Req any] struct {
reader io.ReadCloser
}
// Receive reads a request message from a client stream.
func (b *ClientStream[Req]) Receive() (*Req, error) {
var request Req
err := Receive(b.reader, &request)
return &request, err
}
// Client streaming handlers should be functions that implement this interface.
type ClientStreamingFunction[Req, Res any] func(ctx context.Context, stream *ClientStream[Req]) (*Response[Res], error)
// HandleClientStreaming wraps a client streaming function in an HTTP handler.
func HandleClientStreaming[Req any, Res any](fn ClientStreamingFunction[Req, Res]) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/grpc")
response, err := fn(r.Context(), &ClientStream[Req]{reader: r.Body})
if err != nil {
goto end
}
err = Send(w, response.Msg)
end:
WriteTrailer(w, err)
}
}