starpc 0.18.2 → 0.19.0
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/dist/e2e/mock/mock.pb.js +10 -6
- package/dist/echo/echo.pb.js +11 -7
- package/dist/rpcstream/pushable-sink.d.ts +0 -0
- package/dist/rpcstream/pushable-sink.js +1 -0
- package/dist/rpcstream/rpcstream.js +1 -1
- package/dist/rpcstream/rpcstream.pb.js +45 -25
- package/dist/srpc/client.js +3 -4
- package/dist/srpc/common-rpc.js +1 -1
- package/dist/srpc/conn.d.ts +1 -1
- package/dist/srpc/conn.js +16 -6
- package/dist/srpc/errors.d.ts +1 -0
- package/dist/srpc/errors.js +23 -0
- package/dist/srpc/index.d.ts +4 -2
- package/dist/srpc/index.js +4 -2
- package/dist/srpc/pushable.d.ts +2 -0
- package/dist/srpc/pushable.js +23 -0
- package/dist/srpc/rpcproto.pb.js +69 -31
- package/dist/srpc/server.d.ts +3 -4
- package/dist/srpc/server.js +11 -12
- package/e2e/mock/mock.pb.go +1 -1
- package/e2e/mock/mock.pb.ts +12 -6
- package/e2e/mock/mock_srpc.pb.go +1 -1
- package/e2e/mock/mock_vtproto.pb.go +13 -5
- package/echo/echo.pb.go +1 -1
- package/echo/echo.pb.ts +13 -7
- package/echo/echo_srpc.pb.go +1 -1
- package/echo/echo_vtproto.pb.go +13 -5
- package/go.mod +3 -3
- package/go.sum +6 -6
- package/package.json +18 -18
- package/srpc/client-prefix.go +7 -0
- package/srpc/client-set.go +18 -3
- package/srpc/client.go +19 -3
- package/srpc/client.ts +3 -9
- package/srpc/common-rpc.ts +1 -1
- package/srpc/conn.ts +22 -8
- package/srpc/errors.go +2 -0
- package/srpc/errors.ts +24 -0
- package/srpc/index.ts +9 -2
- package/srpc/message.go +12 -0
- package/srpc/muxed-conn.go +1 -1
- package/srpc/packet-rw.go +18 -15
- package/srpc/packet.go +19 -0
- package/srpc/pushable.ts +23 -0
- package/srpc/raw-stream-rwc.go +153 -0
- package/srpc/rpcproto.pb.go +1 -1
- package/srpc/rpcproto.pb.ts +89 -34
- package/srpc/rpcproto_vtproto.pb.go +35 -13
- package/srpc/server-pipe.go +1 -1
- package/srpc/server-rpc.go +9 -0
- package/srpc/server.go +2 -1
- package/srpc/server.ts +11 -13
- package/srpc/stream-rwc.go +85 -0
- package/srpc/stream.ts +1 -0
- package/srpc/writer.go +2 -0
package/srpc/packet-rw.go
CHANGED
|
@@ -13,9 +13,9 @@ import (
|
|
|
13
13
|
// maxMessageSize is the max message size in bytes
|
|
14
14
|
var maxMessageSize = 1e7
|
|
15
15
|
|
|
16
|
-
//
|
|
16
|
+
// PacketReadWriter reads and writes packets from a io.ReadWriter.
|
|
17
17
|
// Uses a LittleEndian uint32 length prefix.
|
|
18
|
-
type
|
|
18
|
+
type PacketReadWriter struct {
|
|
19
19
|
// rw is the io.ReadWriterCloser
|
|
20
20
|
rw io.ReadWriteCloser
|
|
21
21
|
// buf is the buffered data
|
|
@@ -25,12 +25,19 @@ type PacketReaderWriter struct {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// NewPacketReadWriter constructs a new read/writer.
|
|
28
|
-
func NewPacketReadWriter(rw io.ReadWriteCloser) *
|
|
29
|
-
return &
|
|
28
|
+
func NewPacketReadWriter(rw io.ReadWriteCloser) *PacketReadWriter {
|
|
29
|
+
return &PacketReadWriter{rw: rw}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Write writes raw data to the remote.
|
|
33
|
+
func (r *PacketReadWriter) Write(p []byte) (n int, err error) {
|
|
34
|
+
r.writeMtx.Lock()
|
|
35
|
+
defer r.writeMtx.Unlock()
|
|
36
|
+
return r.rw.Write(p)
|
|
30
37
|
}
|
|
31
38
|
|
|
32
39
|
// WritePacket writes a packet to the writer.
|
|
33
|
-
func (r *
|
|
40
|
+
func (r *PacketReadWriter) WritePacket(p *Packet) error {
|
|
34
41
|
r.writeMtx.Lock()
|
|
35
42
|
defer r.writeMtx.Unlock()
|
|
36
43
|
|
|
@@ -55,7 +62,7 @@ func (r *PacketReaderWriter) WritePacket(p *Packet) error {
|
|
|
55
62
|
// ReadPump executes the read pump in a goroutine.
|
|
56
63
|
//
|
|
57
64
|
// calls the handler when closed or returning an error
|
|
58
|
-
func (r *
|
|
65
|
+
func (r *PacketReadWriter) ReadPump(cb PacketDataHandler, closed CloseHandler) {
|
|
59
66
|
err := r.ReadToHandler(cb)
|
|
60
67
|
// signal that the stream is now closed.
|
|
61
68
|
if closed != nil {
|
|
@@ -65,7 +72,7 @@ func (r *PacketReaderWriter) ReadPump(cb PacketHandler, closed CloseHandler) {
|
|
|
65
72
|
|
|
66
73
|
// ReadToHandler reads data to the given handler.
|
|
67
74
|
// Does not handle closing the stream, use ReadPump instead.
|
|
68
|
-
func (r *
|
|
75
|
+
func (r *PacketReadWriter) ReadToHandler(cb PacketDataHandler) error {
|
|
69
76
|
var currLen uint32
|
|
70
77
|
buf := make([]byte, 2048)
|
|
71
78
|
isOpen := true
|
|
@@ -107,11 +114,7 @@ func (r *PacketReaderWriter) ReadToHandler(cb PacketHandler) error {
|
|
|
107
114
|
if currLen != 0 && bufLen >= int(currLen)+4 {
|
|
108
115
|
pkt := r.buf.Next(int(currLen + 4))[4:]
|
|
109
116
|
currLen = 0
|
|
110
|
-
|
|
111
|
-
if err := npkt.UnmarshalVT(pkt); err != nil {
|
|
112
|
-
return err
|
|
113
|
-
}
|
|
114
|
-
if err := cb(npkt); err != nil {
|
|
117
|
+
if err := cb(pkt); err != nil {
|
|
115
118
|
return err
|
|
116
119
|
}
|
|
117
120
|
}
|
|
@@ -122,12 +125,12 @@ func (r *PacketReaderWriter) ReadToHandler(cb PacketHandler) error {
|
|
|
122
125
|
}
|
|
123
126
|
|
|
124
127
|
// Close closes the packet rw.
|
|
125
|
-
func (r *
|
|
128
|
+
func (r *PacketReadWriter) Close() error {
|
|
126
129
|
return r.rw.Close()
|
|
127
130
|
}
|
|
128
131
|
|
|
129
132
|
// readLengthPrefix reads the length prefix.
|
|
130
|
-
func (r *
|
|
133
|
+
func (r *PacketReadWriter) readLengthPrefix(b []byte) uint32 {
|
|
131
134
|
if len(b) < 4 {
|
|
132
135
|
return 0
|
|
133
136
|
}
|
|
@@ -135,4 +138,4 @@ func (r *PacketReaderWriter) readLengthPrefix(b []byte) uint32 {
|
|
|
135
138
|
}
|
|
136
139
|
|
|
137
140
|
// _ is a type assertion
|
|
138
|
-
var _ Writer = (*
|
|
141
|
+
var _ Writer = (*PacketReadWriter)(nil)
|
package/srpc/packet.go
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
package srpc
|
|
2
2
|
|
|
3
|
+
import "context"
|
|
4
|
+
|
|
3
5
|
// PacketHandler handles a packet.
|
|
4
6
|
//
|
|
5
7
|
// pkt is optional (can be nil)
|
|
6
8
|
// if closeErr is set, the stream is closed after pkt.
|
|
7
9
|
type PacketHandler = func(pkt *Packet) error
|
|
8
10
|
|
|
11
|
+
// PacketDataHandler handles a packet before it is parsed.
|
|
12
|
+
type PacketDataHandler = func(data []byte) error
|
|
13
|
+
|
|
9
14
|
// CloseHandler handles the stream closing with an optional error.
|
|
10
15
|
type CloseHandler = func(closeErr error)
|
|
11
16
|
|
|
17
|
+
// RawStreamCtor is a function that builds a raw stream.
|
|
18
|
+
type RawStreamCtor func(ctx context.Context, msgHandler PacketDataHandler, closeHandler CloseHandler) (Writer, error)
|
|
19
|
+
|
|
20
|
+
// NewPacketDataHandler wraps a PacketHandler with a decoding step.
|
|
21
|
+
func NewPacketDataHandler(handler PacketHandler) PacketDataHandler {
|
|
22
|
+
return func(data []byte) error {
|
|
23
|
+
pkt := &Packet{}
|
|
24
|
+
if err := pkt.UnmarshalVT(data); err != nil {
|
|
25
|
+
return err
|
|
26
|
+
}
|
|
27
|
+
return handler(pkt)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
12
31
|
// Validate performs cursory validation of the packet.
|
|
13
32
|
func (p *Packet) Validate() error {
|
|
14
33
|
switch b := p.GetBody().(type) {
|
package/srpc/pushable.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { Pushable } from 'it-pushable'
|
|
2
|
+
import { Source, Sink } from 'it-stream-types'
|
|
3
|
+
import { castToError } from './errors.js'
|
|
2
4
|
|
|
3
5
|
// writeToPushable writes the incoming server data to the pushable.
|
|
4
6
|
export async function writeToPushable<T>(
|
|
@@ -15,3 +17,24 @@ export async function writeToPushable<T>(
|
|
|
15
17
|
throw err
|
|
16
18
|
}
|
|
17
19
|
}
|
|
20
|
+
|
|
21
|
+
// buildPushableSink builds a Sink from a Pushable.
|
|
22
|
+
export function buildPushableSink<T>(target: Pushable<T>): Sink<T> {
|
|
23
|
+
return async function pushableSink(source: Source<T>): Promise<void> {
|
|
24
|
+
try {
|
|
25
|
+
for await (const pkt of source) {
|
|
26
|
+
if (Array.isArray(pkt)) {
|
|
27
|
+
for (const p of pkt) {
|
|
28
|
+
target.push(p)
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
target.push(pkt)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
target.end()
|
|
35
|
+
} catch (err) {
|
|
36
|
+
const error = castToError(err)
|
|
37
|
+
target.end(error)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
package srpc
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"io"
|
|
6
|
+
"sync"
|
|
7
|
+
|
|
8
|
+
"github.com/aperturerobotics/util/broadcast"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// RawStreamRwc implements io.ReadWriteCloser with a raw stream.
|
|
12
|
+
type RawStreamRwc struct {
|
|
13
|
+
// writer is used to write messages to the remote.
|
|
14
|
+
writer Writer
|
|
15
|
+
// mtx guards below fields
|
|
16
|
+
mtx sync.Mutex
|
|
17
|
+
// bcast is broadcasted when data is added to readQueue
|
|
18
|
+
bcast broadcast.Broadcast
|
|
19
|
+
// readQueue holds incoming data to read
|
|
20
|
+
readQueue [][]byte
|
|
21
|
+
// closed indicates whether the stream is closed
|
|
22
|
+
closed bool
|
|
23
|
+
// closeErr stores the error, if any, when closing the stream
|
|
24
|
+
closeErr error
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func NewRawStreamRwc(ctx context.Context, ctorFn RawStreamCtor) (*RawStreamRwc, error) {
|
|
28
|
+
rwc := &RawStreamRwc{}
|
|
29
|
+
var err error
|
|
30
|
+
rwc.writer, err = ctorFn(ctx, rwc.handlePacketData, rwc.handleClose)
|
|
31
|
+
if err != nil {
|
|
32
|
+
return nil, err
|
|
33
|
+
}
|
|
34
|
+
return rwc, nil
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// handlePacketData implements PacketDataHandler.
|
|
38
|
+
func (r *RawStreamRwc) handlePacketData(pkt []byte) error {
|
|
39
|
+
r.mtx.Lock()
|
|
40
|
+
defer r.mtx.Unlock()
|
|
41
|
+
|
|
42
|
+
if r.closed {
|
|
43
|
+
return io.ErrClosedPipe
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
r.readQueue = append(r.readQueue, pkt)
|
|
47
|
+
r.bcast.Broadcast()
|
|
48
|
+
return nil
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// handleClose handles the stream closing with an optional error.
|
|
52
|
+
func (r *RawStreamRwc) handleClose(closeErr error) {
|
|
53
|
+
r.mtx.Lock()
|
|
54
|
+
defer r.mtx.Unlock()
|
|
55
|
+
if r.closed {
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
r.closed = true
|
|
59
|
+
r.closeErr = closeErr
|
|
60
|
+
r.bcast.Broadcast()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Read reads data from the stream to p.
|
|
64
|
+
// Implements io.Reader.
|
|
65
|
+
func (r *RawStreamRwc) Read(p []byte) (n int, err error) {
|
|
66
|
+
readBuf := p
|
|
67
|
+
for len(readBuf) != 0 && err == nil {
|
|
68
|
+
// if the buffer has data, read from it.
|
|
69
|
+
var rn int
|
|
70
|
+
var read []byte
|
|
71
|
+
|
|
72
|
+
r.mtx.Lock()
|
|
73
|
+
if len(r.readQueue) != 0 {
|
|
74
|
+
nrq := r.readQueue[0]
|
|
75
|
+
rn = len(readBuf)
|
|
76
|
+
if nrLen := len(nrq); nrLen < rn {
|
|
77
|
+
rn = nrLen
|
|
78
|
+
}
|
|
79
|
+
read = nrq[:rn]
|
|
80
|
+
nrq = nrq[rn:]
|
|
81
|
+
if len(nrq) == 0 {
|
|
82
|
+
r.readQueue[0] = nil
|
|
83
|
+
r.readQueue = r.readQueue[1:]
|
|
84
|
+
} else {
|
|
85
|
+
r.readQueue[0] = nrq
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
closed, closedErr := r.closed, r.closeErr
|
|
89
|
+
var wait <-chan struct{}
|
|
90
|
+
if rn == 0 && !closed {
|
|
91
|
+
wait = r.bcast.GetWaitCh()
|
|
92
|
+
}
|
|
93
|
+
r.mtx.Unlock()
|
|
94
|
+
|
|
95
|
+
// if we read data, copy it to the output buf
|
|
96
|
+
if rn != 0 {
|
|
97
|
+
// advance readBuf by rn
|
|
98
|
+
copy(readBuf, read)
|
|
99
|
+
n += rn
|
|
100
|
+
readBuf = readBuf[rn:]
|
|
101
|
+
continue
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// if we read data to p already, return now.
|
|
105
|
+
if n != 0 {
|
|
106
|
+
break
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// if closed or error, return.
|
|
110
|
+
if closed {
|
|
111
|
+
if closedErr != nil {
|
|
112
|
+
return n, closedErr
|
|
113
|
+
}
|
|
114
|
+
return n, io.EOF
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// wait for data or closed
|
|
118
|
+
<-wait
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return n, err
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Write writes data to the stream.
|
|
125
|
+
func (r *RawStreamRwc) Write(p []byte) (int, error) {
|
|
126
|
+
return r.writer.Write(p)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// WritePacket writes a packet to the remote.
|
|
130
|
+
func (r *RawStreamRwc) WritePacket(p *Packet) error {
|
|
131
|
+
return r.writer.WritePacket(p)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Close closes the stream.
|
|
135
|
+
func (r *RawStreamRwc) Close() error {
|
|
136
|
+
r.mtx.Lock()
|
|
137
|
+
defer r.mtx.Unlock()
|
|
138
|
+
|
|
139
|
+
if r.closed {
|
|
140
|
+
return r.closeErr
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
r.closed = true
|
|
144
|
+
r.closeErr = r.writer.Close()
|
|
145
|
+
r.bcast.Broadcast()
|
|
146
|
+
return r.closeErr
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// _ is a type assertion
|
|
150
|
+
var (
|
|
151
|
+
_ io.ReadWriteCloser = ((*RawStreamRwc)(nil))
|
|
152
|
+
_ Writer = ((*RawStreamRwc)(nil))
|
|
153
|
+
)
|
package/srpc/rpcproto.pb.go
CHANGED
package/srpc/rpcproto.pb.ts
CHANGED
|
@@ -60,47 +60,66 @@ export const Packet = {
|
|
|
60
60
|
message: Packet,
|
|
61
61
|
writer: _m0.Writer = _m0.Writer.create()
|
|
62
62
|
): _m0.Writer {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
63
|
+
switch (message.body?.$case) {
|
|
64
|
+
case 'callStart':
|
|
65
|
+
CallStart.encode(
|
|
66
|
+
message.body.callStart,
|
|
67
|
+
writer.uint32(10).fork()
|
|
68
|
+
).ldelim()
|
|
69
|
+
break
|
|
70
|
+
case 'callData':
|
|
71
|
+
CallData.encode(
|
|
72
|
+
message.body.callData,
|
|
73
|
+
writer.uint32(18).fork()
|
|
74
|
+
).ldelim()
|
|
75
|
+
break
|
|
76
|
+
case 'callCancel':
|
|
77
|
+
writer.uint32(24).bool(message.body.callCancel)
|
|
78
|
+
break
|
|
74
79
|
}
|
|
75
80
|
return writer
|
|
76
81
|
},
|
|
77
82
|
|
|
78
83
|
decode(input: _m0.Reader | Uint8Array, length?: number): Packet {
|
|
79
|
-
const reader =
|
|
84
|
+
const reader =
|
|
85
|
+
input instanceof _m0.Reader ? input : _m0.Reader.create(input)
|
|
80
86
|
let end = length === undefined ? reader.len : reader.pos + length
|
|
81
87
|
const message = createBasePacket()
|
|
82
88
|
while (reader.pos < end) {
|
|
83
89
|
const tag = reader.uint32()
|
|
84
90
|
switch (tag >>> 3) {
|
|
85
91
|
case 1:
|
|
92
|
+
if (tag != 10) {
|
|
93
|
+
break
|
|
94
|
+
}
|
|
95
|
+
|
|
86
96
|
message.body = {
|
|
87
97
|
$case: 'callStart',
|
|
88
98
|
callStart: CallStart.decode(reader, reader.uint32()),
|
|
89
99
|
}
|
|
90
|
-
|
|
100
|
+
continue
|
|
91
101
|
case 2:
|
|
102
|
+
if (tag != 18) {
|
|
103
|
+
break
|
|
104
|
+
}
|
|
105
|
+
|
|
92
106
|
message.body = {
|
|
93
107
|
$case: 'callData',
|
|
94
108
|
callData: CallData.decode(reader, reader.uint32()),
|
|
95
109
|
}
|
|
96
|
-
|
|
110
|
+
continue
|
|
97
111
|
case 3:
|
|
112
|
+
if (tag != 24) {
|
|
113
|
+
break
|
|
114
|
+
}
|
|
115
|
+
|
|
98
116
|
message.body = { $case: 'callCancel', callCancel: reader.bool() }
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
117
|
+
continue
|
|
118
|
+
}
|
|
119
|
+
if ((tag & 7) == 4 || tag == 0) {
|
|
120
|
+
break
|
|
103
121
|
}
|
|
122
|
+
reader.skipType(tag & 7)
|
|
104
123
|
}
|
|
105
124
|
return message
|
|
106
125
|
},
|
|
@@ -236,28 +255,46 @@ export const CallStart = {
|
|
|
236
255
|
},
|
|
237
256
|
|
|
238
257
|
decode(input: _m0.Reader | Uint8Array, length?: number): CallStart {
|
|
239
|
-
const reader =
|
|
258
|
+
const reader =
|
|
259
|
+
input instanceof _m0.Reader ? input : _m0.Reader.create(input)
|
|
240
260
|
let end = length === undefined ? reader.len : reader.pos + length
|
|
241
261
|
const message = createBaseCallStart()
|
|
242
262
|
while (reader.pos < end) {
|
|
243
263
|
const tag = reader.uint32()
|
|
244
264
|
switch (tag >>> 3) {
|
|
245
265
|
case 1:
|
|
266
|
+
if (tag != 10) {
|
|
267
|
+
break
|
|
268
|
+
}
|
|
269
|
+
|
|
246
270
|
message.rpcService = reader.string()
|
|
247
|
-
|
|
271
|
+
continue
|
|
248
272
|
case 2:
|
|
273
|
+
if (tag != 18) {
|
|
274
|
+
break
|
|
275
|
+
}
|
|
276
|
+
|
|
249
277
|
message.rpcMethod = reader.string()
|
|
250
|
-
|
|
278
|
+
continue
|
|
251
279
|
case 3:
|
|
280
|
+
if (tag != 26) {
|
|
281
|
+
break
|
|
282
|
+
}
|
|
283
|
+
|
|
252
284
|
message.data = reader.bytes()
|
|
253
|
-
|
|
285
|
+
continue
|
|
254
286
|
case 4:
|
|
287
|
+
if (tag != 32) {
|
|
288
|
+
break
|
|
289
|
+
}
|
|
290
|
+
|
|
255
291
|
message.dataIsZero = reader.bool()
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
292
|
+
continue
|
|
293
|
+
}
|
|
294
|
+
if ((tag & 7) == 4 || tag == 0) {
|
|
295
|
+
break
|
|
260
296
|
}
|
|
297
|
+
reader.skipType(tag & 7)
|
|
261
298
|
}
|
|
262
299
|
return message
|
|
263
300
|
},
|
|
@@ -367,28 +404,46 @@ export const CallData = {
|
|
|
367
404
|
},
|
|
368
405
|
|
|
369
406
|
decode(input: _m0.Reader | Uint8Array, length?: number): CallData {
|
|
370
|
-
const reader =
|
|
407
|
+
const reader =
|
|
408
|
+
input instanceof _m0.Reader ? input : _m0.Reader.create(input)
|
|
371
409
|
let end = length === undefined ? reader.len : reader.pos + length
|
|
372
410
|
const message = createBaseCallData()
|
|
373
411
|
while (reader.pos < end) {
|
|
374
412
|
const tag = reader.uint32()
|
|
375
413
|
switch (tag >>> 3) {
|
|
376
414
|
case 1:
|
|
415
|
+
if (tag != 10) {
|
|
416
|
+
break
|
|
417
|
+
}
|
|
418
|
+
|
|
377
419
|
message.data = reader.bytes()
|
|
378
|
-
|
|
420
|
+
continue
|
|
379
421
|
case 2:
|
|
422
|
+
if (tag != 16) {
|
|
423
|
+
break
|
|
424
|
+
}
|
|
425
|
+
|
|
380
426
|
message.dataIsZero = reader.bool()
|
|
381
|
-
|
|
427
|
+
continue
|
|
382
428
|
case 3:
|
|
429
|
+
if (tag != 24) {
|
|
430
|
+
break
|
|
431
|
+
}
|
|
432
|
+
|
|
383
433
|
message.complete = reader.bool()
|
|
384
|
-
|
|
434
|
+
continue
|
|
385
435
|
case 4:
|
|
436
|
+
if (tag != 34) {
|
|
437
|
+
break
|
|
438
|
+
}
|
|
439
|
+
|
|
386
440
|
message.error = reader.string()
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
441
|
+
continue
|
|
442
|
+
}
|
|
443
|
+
if ((tag & 7) == 4 || tag == 0) {
|
|
444
|
+
break
|
|
391
445
|
}
|
|
446
|
+
reader.skipType(tag & 7)
|
|
392
447
|
}
|
|
393
448
|
return message
|
|
394
449
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Code generated by protoc-gen-go-vtproto. DO NOT EDIT.
|
|
2
|
-
// protoc-gen-go-vtproto version: v0.
|
|
2
|
+
// protoc-gen-go-vtproto version: v0.4.0
|
|
3
3
|
// source: github.com/aperturerobotics/starpc/srpc/rpcproto.proto
|
|
4
4
|
|
|
5
5
|
package srpc
|
|
@@ -35,7 +35,7 @@ func (m *Packet) CloneVT() *Packet {
|
|
|
35
35
|
return r
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
func (m *Packet)
|
|
38
|
+
func (m *Packet) CloneMessageVT() proto.Message {
|
|
39
39
|
return m.CloneVT()
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -90,7 +90,7 @@ func (m *CallStart) CloneVT() *CallStart {
|
|
|
90
90
|
return r
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
func (m *CallStart)
|
|
93
|
+
func (m *CallStart) CloneMessageVT() proto.Message {
|
|
94
94
|
return m.CloneVT()
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -115,14 +115,14 @@ func (m *CallData) CloneVT() *CallData {
|
|
|
115
115
|
return r
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
func (m *CallData)
|
|
118
|
+
func (m *CallData) CloneMessageVT() proto.Message {
|
|
119
119
|
return m.CloneVT()
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
func (this *Packet) EqualVT(that *Packet) bool {
|
|
123
|
-
if this ==
|
|
124
|
-
return
|
|
125
|
-
} else if that == nil {
|
|
123
|
+
if this == that {
|
|
124
|
+
return true
|
|
125
|
+
} else if this == nil || that == nil {
|
|
126
126
|
return false
|
|
127
127
|
}
|
|
128
128
|
if this.Body == nil && that.Body != nil {
|
|
@@ -138,6 +138,13 @@ func (this *Packet) EqualVT(that *Packet) bool {
|
|
|
138
138
|
return string(this.unknownFields) == string(that.unknownFields)
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
func (this *Packet) EqualMessageVT(thatMsg proto.Message) bool {
|
|
142
|
+
that, ok := thatMsg.(*Packet)
|
|
143
|
+
if !ok {
|
|
144
|
+
return false
|
|
145
|
+
}
|
|
146
|
+
return this.EqualVT(that)
|
|
147
|
+
}
|
|
141
148
|
func (this *Packet_CallStart) EqualVT(thatIface isPacket_Body) bool {
|
|
142
149
|
that, ok := thatIface.(*Packet_CallStart)
|
|
143
150
|
if !ok {
|
|
@@ -206,9 +213,9 @@ func (this *Packet_CallCancel) EqualVT(thatIface isPacket_Body) bool {
|
|
|
206
213
|
}
|
|
207
214
|
|
|
208
215
|
func (this *CallStart) EqualVT(that *CallStart) bool {
|
|
209
|
-
if this ==
|
|
210
|
-
return
|
|
211
|
-
} else if that == nil {
|
|
216
|
+
if this == that {
|
|
217
|
+
return true
|
|
218
|
+
} else if this == nil || that == nil {
|
|
212
219
|
return false
|
|
213
220
|
}
|
|
214
221
|
if this.RpcService != that.RpcService {
|
|
@@ -226,10 +233,17 @@ func (this *CallStart) EqualVT(that *CallStart) bool {
|
|
|
226
233
|
return string(this.unknownFields) == string(that.unknownFields)
|
|
227
234
|
}
|
|
228
235
|
|
|
236
|
+
func (this *CallStart) EqualMessageVT(thatMsg proto.Message) bool {
|
|
237
|
+
that, ok := thatMsg.(*CallStart)
|
|
238
|
+
if !ok {
|
|
239
|
+
return false
|
|
240
|
+
}
|
|
241
|
+
return this.EqualVT(that)
|
|
242
|
+
}
|
|
229
243
|
func (this *CallData) EqualVT(that *CallData) bool {
|
|
230
|
-
if this ==
|
|
231
|
-
return
|
|
232
|
-
} else if that == nil {
|
|
244
|
+
if this == that {
|
|
245
|
+
return true
|
|
246
|
+
} else if this == nil || that == nil {
|
|
233
247
|
return false
|
|
234
248
|
}
|
|
235
249
|
if string(this.Data) != string(that.Data) {
|
|
@@ -247,6 +261,13 @@ func (this *CallData) EqualVT(that *CallData) bool {
|
|
|
247
261
|
return string(this.unknownFields) == string(that.unknownFields)
|
|
248
262
|
}
|
|
249
263
|
|
|
264
|
+
func (this *CallData) EqualMessageVT(thatMsg proto.Message) bool {
|
|
265
|
+
that, ok := thatMsg.(*CallData)
|
|
266
|
+
if !ok {
|
|
267
|
+
return false
|
|
268
|
+
}
|
|
269
|
+
return this.EqualVT(that)
|
|
270
|
+
}
|
|
250
271
|
func (m *Packet) MarshalVT() (dAtA []byte, err error) {
|
|
251
272
|
if m == nil {
|
|
252
273
|
return nil, nil
|
|
@@ -1067,6 +1088,7 @@ func (m *CallData) UnmarshalVT(dAtA []byte) error {
|
|
|
1067
1088
|
}
|
|
1068
1089
|
return nil
|
|
1069
1090
|
}
|
|
1091
|
+
|
|
1070
1092
|
func skip(dAtA []byte) (n int, err error) {
|
|
1071
1093
|
l := len(dAtA)
|
|
1072
1094
|
iNdEx := 0
|
package/srpc/server-pipe.go
CHANGED
|
@@ -9,7 +9,7 @@ import (
|
|
|
9
9
|
// Stream with the given Server. Starts read pumps for both. Starts the
|
|
10
10
|
// HandleStream function on the server in a separate goroutine.
|
|
11
11
|
func NewServerPipe(server *Server) OpenStreamFunc {
|
|
12
|
-
return func(ctx context.Context, msgHandler
|
|
12
|
+
return func(ctx context.Context, msgHandler PacketDataHandler, closeHandler CloseHandler) (Writer, error) {
|
|
13
13
|
srvPipe, clientPipe := net.Pipe()
|
|
14
14
|
go server.HandleStream(ctx, srvPipe)
|
|
15
15
|
clientPrw := NewPacketReadWriter(clientPipe)
|
package/srpc/server-rpc.go
CHANGED
|
@@ -22,6 +22,15 @@ func NewServerRPC(ctx context.Context, invoker Invoker, writer Writer) *ServerRP
|
|
|
22
22
|
return rpc
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
// HandlePacketData handles an incoming unparsed message packet.
|
|
26
|
+
func (r *ServerRPC) HandlePacketData(data []byte) error {
|
|
27
|
+
msg := &Packet{}
|
|
28
|
+
if err := msg.UnmarshalVT(data); err != nil {
|
|
29
|
+
return err
|
|
30
|
+
}
|
|
31
|
+
return r.HandlePacket(msg)
|
|
32
|
+
}
|
|
33
|
+
|
|
25
34
|
// HandlePacket handles an incoming parsed message packet.
|
|
26
35
|
func (r *ServerRPC) HandlePacket(msg *Packet) error {
|
|
27
36
|
if msg == nil {
|
package/srpc/server.go
CHANGED
|
@@ -26,12 +26,13 @@ func (s *Server) GetInvoker() Invoker {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// HandleStream handles an incoming stream and runs the read loop.
|
|
29
|
+
// Uses length-prefixed packets.
|
|
29
30
|
func (s *Server) HandleStream(ctx context.Context, rwc io.ReadWriteCloser) {
|
|
30
31
|
subCtx, subCtxCancel := context.WithCancel(ctx)
|
|
31
32
|
defer subCtxCancel()
|
|
32
33
|
prw := NewPacketReadWriter(rwc)
|
|
33
34
|
serverRPC := NewServerRPC(subCtx, s.invoker, prw)
|
|
34
|
-
prw.ReadPump(serverRPC.
|
|
35
|
+
prw.ReadPump(serverRPC.HandlePacketData, serverRPC.HandleStreamClose)
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
// AcceptMuxedConn runs a loop which calls Accept on a muxer to handle streams.
|