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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starpc",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "description": "Streaming protobuf RPC service protocol over any two-way channel.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -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
- r.Close()
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
- r.ctxCancel()
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
  }