starpc 0.8.2 → 0.8.5

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.2",
3
+ "version": "0.8.5",
4
4
  "description": "Streaming protobuf RPC service protocol over any two-way channel.",
5
5
  "license": "MIT",
6
6
  "author": {
package/srpc/accept.go ADDED
@@ -0,0 +1,29 @@
1
+ package srpc
2
+
3
+ import (
4
+ "context"
5
+ "net"
6
+ )
7
+
8
+ // AcceptMuxedListener accepts incoming connections from a net.Listener.
9
+ //
10
+ // Uses the default mplex muxer.
11
+ func AcceptMuxedListener(ctx context.Context, lis net.Listener, srv *Server) error {
12
+ for {
13
+ nc, err := lis.Accept()
14
+ if err != nil {
15
+ return err
16
+ }
17
+
18
+ mc, err := NewMuxedConn(nc, true)
19
+ if err != nil {
20
+ _ = nc.Close()
21
+ continue
22
+ }
23
+
24
+ if err := srv.AcceptMuxedConn(ctx, mc); err != nil {
25
+ _ = nc.Close()
26
+ continue
27
+ }
28
+ }
29
+ }
@@ -2,6 +2,7 @@ package srpc
2
2
 
3
3
  import (
4
4
  "context"
5
+ "io"
5
6
 
6
7
  "github.com/pkg/errors"
7
8
  )
@@ -86,6 +87,24 @@ func (r *ClientRPC) ReadAll() ([][]byte, error) {
86
87
  }
87
88
  }
88
89
 
90
+ // ReadOne reads a single message and returns.
91
+ //
92
+ // returns io.EOF if the stream ended.
93
+ func (r *ClientRPC) ReadOne() ([]byte, error) {
94
+ select {
95
+ case <-r.ctx.Done():
96
+ return nil, context.Canceled
97
+ case data, ok := <-r.dataCh:
98
+ if !ok {
99
+ if err := r.serverErr; err != nil {
100
+ return nil, err
101
+ }
102
+ return nil, io.EOF
103
+ }
104
+ return data, nil
105
+ }
106
+ }
107
+
89
108
  // Context is canceled when the ClientRPC is no longer valid.
90
109
  func (r *ClientRPC) Context() context.Context {
91
110
  return r.ctx
package/srpc/client.go CHANGED
@@ -2,7 +2,6 @@ package srpc
2
2
 
3
3
  import (
4
4
  "context"
5
- "io"
6
5
 
7
6
  "github.com/pkg/errors"
8
7
  )
@@ -55,17 +54,12 @@ func (c *client) Invoke(rctx context.Context, service, method string, in, out Me
55
54
  if err := clientRPC.Start(writer, true, firstMsg); err != nil {
56
55
  return err
57
56
  }
58
- msgs, err := clientRPC.ReadAll()
57
+ msg, err := clientRPC.ReadOne()
59
58
  if err != nil {
60
59
  // this includes any server returned error.
61
60
  return err
62
61
  }
63
- if len(msgs) == 0 {
64
- // no reply? return eof.
65
- return io.EOF
66
- }
67
- // parse first message to out
68
- if err := out.UnmarshalVT(msgs[0]); err != nil {
62
+ if err := out.UnmarshalVT(msg); err != nil {
69
63
  return errors.Wrap(ErrInvalidMessage, err.Error())
70
64
  }
71
65
  // done
package/srpc/packet-rw.go CHANGED
@@ -2,6 +2,7 @@ package srpc
2
2
 
3
3
  import (
4
4
  "bytes"
5
+ "context"
5
6
  "encoding/binary"
6
7
  "io"
7
8
 
@@ -34,7 +35,15 @@ func (r *PacketReaderWriter) WritePacket(p *Packet) error {
34
35
  if err != nil {
35
36
  return err
36
37
  }
37
- _, err = r.rw.Write(data)
38
+ var n int
39
+ written := 0
40
+ for written < len(data) {
41
+ n, err = r.rw.Write(data)
42
+ if err != nil {
43
+ return err
44
+ }
45
+ written += n
46
+ }
38
47
  return err
39
48
  }
40
49
 
@@ -54,15 +63,18 @@ func (r *PacketReaderWriter) ReadPump(cb PacketHandler, closed CloseHandler) {
54
63
  func (r *PacketReaderWriter) ReadToHandler(cb PacketHandler) error {
55
64
  var currLen uint32
56
65
  buf := make([]byte, 2048)
57
- for {
66
+ isOpen := true
67
+ for isOpen {
58
68
  // read some data into the buffer
59
69
  n, err := r.rw.Read(buf)
60
70
  if err != nil {
61
- if err == io.EOF {
62
- err = nil
71
+ if err == io.EOF || err == context.Canceled {
72
+ isOpen = false
73
+ } else {
74
+ return err
63
75
  }
64
- return err
65
76
  }
77
+
66
78
  // push the data to r.buf
67
79
  _, err = r.buf.Write(buf[:n])
68
80
  if err != nil {
@@ -99,6 +111,9 @@ func (r *PacketReaderWriter) ReadToHandler(cb PacketHandler) error {
99
111
  }
100
112
  }
101
113
  }
114
+
115
+ // closed
116
+ return nil
102
117
  }
103
118
 
104
119
  // Close closes the packet rw.
@@ -2,6 +2,7 @@ package srpc
2
2
 
3
3
  import (
4
4
  "context"
5
+ "io"
5
6
 
6
7
  "github.com/pkg/errors"
7
8
  )
@@ -66,12 +67,19 @@ func (r *ServerRPC) Wait(ctx context.Context) error {
66
67
 
67
68
  // HandleStreamClose handles the incoming stream closing w/ optional error.
68
69
  func (r *ServerRPC) HandleStreamClose(closeErr error) {
70
+ if r.dataChClosed {
71
+ return
72
+ }
69
73
  if closeErr != nil {
70
74
  if r.clientErr == nil {
71
75
  r.clientErr = closeErr
72
76
  }
73
- r.Close()
77
+ if closeErr != io.EOF && closeErr != context.Canceled {
78
+ r.Close()
79
+ }
74
80
  }
81
+ r.dataChClosed = true
82
+ close(r.dataCh)
75
83
  }
76
84
 
77
85
  // HandlePacket handles an incoming parsed message packet.
@@ -163,8 +171,8 @@ func (r *ServerRPC) invokeRPC() {
163
171
  }
164
172
  outPkt := NewCallDataPacket(nil, false, true, err)
165
173
  _ = r.writer.WritePacket(outPkt)
166
- r.ctxCancel()
167
174
  _ = r.writer.Close()
175
+ r.ctxCancel()
168
176
  }
169
177
 
170
178
  // Close releases any resources held by the ServerRPC.
@@ -173,9 +181,9 @@ func (r *ServerRPC) Close() {
173
181
  if r.clientErr == nil {
174
182
  r.clientErr = context.Canceled
175
183
  }
176
- r.ctxCancel()
177
184
  if r.service == "" {
178
185
  // invokeRPC has not been called, otherwise it would call Close()
179
186
  _ = r.writer.Close()
180
187
  }
188
+ r.ctxCancel()
181
189
  }