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.
Files changed (55) hide show
  1. package/dist/e2e/mock/mock.pb.js +10 -6
  2. package/dist/echo/echo.pb.js +11 -7
  3. package/dist/rpcstream/pushable-sink.d.ts +0 -0
  4. package/dist/rpcstream/pushable-sink.js +1 -0
  5. package/dist/rpcstream/rpcstream.js +1 -1
  6. package/dist/rpcstream/rpcstream.pb.js +45 -25
  7. package/dist/srpc/client.js +3 -4
  8. package/dist/srpc/common-rpc.js +1 -1
  9. package/dist/srpc/conn.d.ts +1 -1
  10. package/dist/srpc/conn.js +16 -6
  11. package/dist/srpc/errors.d.ts +1 -0
  12. package/dist/srpc/errors.js +23 -0
  13. package/dist/srpc/index.d.ts +4 -2
  14. package/dist/srpc/index.js +4 -2
  15. package/dist/srpc/pushable.d.ts +2 -0
  16. package/dist/srpc/pushable.js +23 -0
  17. package/dist/srpc/rpcproto.pb.js +69 -31
  18. package/dist/srpc/server.d.ts +3 -4
  19. package/dist/srpc/server.js +11 -12
  20. package/e2e/mock/mock.pb.go +1 -1
  21. package/e2e/mock/mock.pb.ts +12 -6
  22. package/e2e/mock/mock_srpc.pb.go +1 -1
  23. package/e2e/mock/mock_vtproto.pb.go +13 -5
  24. package/echo/echo.pb.go +1 -1
  25. package/echo/echo.pb.ts +13 -7
  26. package/echo/echo_srpc.pb.go +1 -1
  27. package/echo/echo_vtproto.pb.go +13 -5
  28. package/go.mod +3 -3
  29. package/go.sum +6 -6
  30. package/package.json +18 -18
  31. package/srpc/client-prefix.go +7 -0
  32. package/srpc/client-set.go +18 -3
  33. package/srpc/client.go +19 -3
  34. package/srpc/client.ts +3 -9
  35. package/srpc/common-rpc.ts +1 -1
  36. package/srpc/conn.ts +22 -8
  37. package/srpc/errors.go +2 -0
  38. package/srpc/errors.ts +24 -0
  39. package/srpc/index.ts +9 -2
  40. package/srpc/message.go +12 -0
  41. package/srpc/muxed-conn.go +1 -1
  42. package/srpc/packet-rw.go +18 -15
  43. package/srpc/packet.go +19 -0
  44. package/srpc/pushable.ts +23 -0
  45. package/srpc/raw-stream-rwc.go +153 -0
  46. package/srpc/rpcproto.pb.go +1 -1
  47. package/srpc/rpcproto.pb.ts +89 -34
  48. package/srpc/rpcproto_vtproto.pb.go +35 -13
  49. package/srpc/server-pipe.go +1 -1
  50. package/srpc/server-rpc.go +9 -0
  51. package/srpc/server.go +2 -1
  52. package/srpc/server.ts +11 -13
  53. package/srpc/stream-rwc.go +85 -0
  54. package/srpc/stream.ts +1 -0
  55. 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
- // PacketReaderWriter reads and writes packets from a io.ReadWriter.
16
+ // PacketReadWriter reads and writes packets from a io.ReadWriter.
17
17
  // Uses a LittleEndian uint32 length prefix.
18
- type PacketReaderWriter struct {
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) *PacketReaderWriter {
29
- return &PacketReaderWriter{rw: rw}
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 *PacketReaderWriter) WritePacket(p *Packet) error {
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 *PacketReaderWriter) ReadPump(cb PacketHandler, closed CloseHandler) {
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 *PacketReaderWriter) ReadToHandler(cb PacketHandler) error {
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
- npkt := &Packet{}
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 *PacketReaderWriter) Close() error {
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 *PacketReaderWriter) readLengthPrefix(b []byte) uint32 {
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 = (*PacketReaderWriter)(nil)
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
+ )
@@ -1,6 +1,6 @@
1
1
  // Code generated by protoc-gen-go. DO NOT EDIT.
2
2
  // versions:
3
- // protoc-gen-go v1.28.1-devel
3
+ // protoc-gen-go v1.30.0-devel
4
4
  // protoc v3.21.9
5
5
  // source: github.com/aperturerobotics/starpc/srpc/rpcproto.proto
6
6
 
@@ -60,47 +60,66 @@ export const Packet = {
60
60
  message: Packet,
61
61
  writer: _m0.Writer = _m0.Writer.create()
62
62
  ): _m0.Writer {
63
- if (message.body?.$case === 'callStart') {
64
- CallStart.encode(
65
- message.body.callStart,
66
- writer.uint32(10).fork()
67
- ).ldelim()
68
- }
69
- if (message.body?.$case === 'callData') {
70
- CallData.encode(message.body.callData, writer.uint32(18).fork()).ldelim()
71
- }
72
- if (message.body?.$case === 'callCancel') {
73
- writer.uint32(24).bool(message.body.callCancel)
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 = input instanceof _m0.Reader ? input : new _m0.Reader(input)
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
- break
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
- break
110
+ continue
97
111
  case 3:
112
+ if (tag != 24) {
113
+ break
114
+ }
115
+
98
116
  message.body = { $case: 'callCancel', callCancel: reader.bool() }
99
- break
100
- default:
101
- reader.skipType(tag & 7)
102
- break
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 = input instanceof _m0.Reader ? input : new _m0.Reader(input)
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
- break
271
+ continue
248
272
  case 2:
273
+ if (tag != 18) {
274
+ break
275
+ }
276
+
249
277
  message.rpcMethod = reader.string()
250
- break
278
+ continue
251
279
  case 3:
280
+ if (tag != 26) {
281
+ break
282
+ }
283
+
252
284
  message.data = reader.bytes()
253
- break
285
+ continue
254
286
  case 4:
287
+ if (tag != 32) {
288
+ break
289
+ }
290
+
255
291
  message.dataIsZero = reader.bool()
256
- break
257
- default:
258
- reader.skipType(tag & 7)
259
- break
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 = input instanceof _m0.Reader ? input : new _m0.Reader(input)
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
- break
420
+ continue
379
421
  case 2:
422
+ if (tag != 16) {
423
+ break
424
+ }
425
+
380
426
  message.dataIsZero = reader.bool()
381
- break
427
+ continue
382
428
  case 3:
429
+ if (tag != 24) {
430
+ break
431
+ }
432
+
383
433
  message.complete = reader.bool()
384
- break
434
+ continue
385
435
  case 4:
436
+ if (tag != 34) {
437
+ break
438
+ }
439
+
386
440
  message.error = reader.string()
387
- break
388
- default:
389
- reader.skipType(tag & 7)
390
- break
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.3.1-0.20220817155510-0ae748fd2007
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) CloneGenericVT() proto.Message {
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) CloneGenericVT() proto.Message {
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) CloneGenericVT() proto.Message {
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 == nil {
124
- return that == nil
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 == nil {
210
- return that == nil
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 == nil {
231
- return that == nil
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
@@ -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 PacketHandler, closeHandler CloseHandler) (Writer, error) {
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)
@@ -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.HandlePacket, serverRPC.HandleStreamClose)
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.