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 +5 -0
- package/package.json +1 -1
- package/srpc/accept.go +29 -0
- package/srpc/client-rpc.go +19 -0
- package/srpc/client.go +2 -8
- package/srpc/packet-rw.go +20 -5
- package/srpc/server-rpc.go +11 -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/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
|
+
}
|
package/srpc/client-rpc.go
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/srpc/server-rpc.go
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|