starpc 0.8.3 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/echo/server.go +5 -0
- package/package.json +1 -1
- package/srpc/server-rpc.go +21 -3
package/echo/server.go
CHANGED
|
@@ -21,6 +21,11 @@ func NewEchoServer(rpcStreamMux srpc.Mux) *EchoServer {
|
|
|
21
21
|
return &EchoServer{rpcStreamMux: rpcStreamMux}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
// Register registers the Echo server with the Mux.
|
|
25
|
+
func (e *EchoServer) Register(mux srpc.Mux) error {
|
|
26
|
+
return SRPCRegisterEchoer(mux, e)
|
|
27
|
+
}
|
|
28
|
+
|
|
24
29
|
// Echo implements echo.SRPCEchoerServer
|
|
25
30
|
func (*EchoServer) Echo(ctx context.Context, msg *EchoMsg) (*EchoMsg, error) {
|
|
26
31
|
return proto.Clone(msg).(*EchoMsg), nil
|
package/package.json
CHANGED
package/srpc/server-rpc.go
CHANGED
|
@@ -2,6 +2,9 @@ package srpc
|
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
4
|
"context"
|
|
5
|
+
"io"
|
|
6
|
+
"runtime"
|
|
7
|
+
"time"
|
|
5
8
|
|
|
6
9
|
"github.com/pkg/errors"
|
|
7
10
|
)
|
|
@@ -66,12 +69,19 @@ func (r *ServerRPC) Wait(ctx context.Context) error {
|
|
|
66
69
|
|
|
67
70
|
// HandleStreamClose handles the incoming stream closing w/ optional error.
|
|
68
71
|
func (r *ServerRPC) HandleStreamClose(closeErr error) {
|
|
72
|
+
if r.dataChClosed {
|
|
73
|
+
return
|
|
74
|
+
}
|
|
69
75
|
if closeErr != nil {
|
|
70
76
|
if r.clientErr == nil {
|
|
71
77
|
r.clientErr = closeErr
|
|
72
78
|
}
|
|
73
|
-
|
|
79
|
+
if closeErr != io.EOF && closeErr != context.Canceled {
|
|
80
|
+
r.Close()
|
|
81
|
+
}
|
|
74
82
|
}
|
|
83
|
+
r.dataChClosed = true
|
|
84
|
+
close(r.dataCh)
|
|
75
85
|
}
|
|
76
86
|
|
|
77
87
|
// HandlePacket handles an incoming parsed message packet.
|
|
@@ -163,8 +173,16 @@ func (r *ServerRPC) invokeRPC() {
|
|
|
163
173
|
}
|
|
164
174
|
outPkt := NewCallDataPacket(nil, false, true, err)
|
|
165
175
|
_ = r.writer.WritePacket(outPkt)
|
|
166
|
-
|
|
176
|
+
|
|
177
|
+
// HACK: some multiplexers will drop the last packet if Close is called too
|
|
178
|
+
// soon after Write. Add a brief delay to ensure the packet is written.
|
|
179
|
+
//
|
|
180
|
+
// See: https://github.com/lucas-clemente/quic-go/issues/3472
|
|
181
|
+
runtime.Gosched()
|
|
182
|
+
time.Sleep(time.Millisecond)
|
|
183
|
+
|
|
167
184
|
_ = r.writer.Close()
|
|
185
|
+
r.ctxCancel()
|
|
168
186
|
}
|
|
169
187
|
|
|
170
188
|
// Close releases any resources held by the ServerRPC.
|
|
@@ -173,9 +191,9 @@ func (r *ServerRPC) Close() {
|
|
|
173
191
|
if r.clientErr == nil {
|
|
174
192
|
r.clientErr = context.Canceled
|
|
175
193
|
}
|
|
176
|
-
r.ctxCancel()
|
|
177
194
|
if r.service == "" {
|
|
178
195
|
// invokeRPC has not been called, otherwise it would call Close()
|
|
179
196
|
_ = r.writer.Close()
|
|
180
197
|
}
|
|
198
|
+
r.ctxCancel()
|
|
181
199
|
}
|