Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 64fd6a5

Browse files
committed
Update libchan to use new msgpack implementation
- Reintroduce SendTo and ReceiveFrom - Use raw message when receiving from spdy - Zero copy in-mem transport - Remove raw connection encoding Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
1 parent dc602ee commit 64fd6a5

9 files changed

Lines changed: 404 additions & 1023 deletions

File tree

copy.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,55 @@
11
package libchan
22

33
import (
4+
"errors"
45
"io"
56
)
67

8+
var (
9+
// ErrIncompatibleSender is used when an object cannot support
10+
// SendTo for its given argument.
11+
ErrIncompatibleSender = errors.New("incompatible sender")
12+
// ErrIncompatibleReceiver is used when an object cannot support
13+
// ReceiveFrom for its given argument.
14+
ErrIncompatibleReceiver = errors.New("incompatible receiver")
15+
)
16+
17+
// ReceiverFrom defines a type which can directly receive objects
18+
// from a receiver.
19+
type ReceiverFrom interface {
20+
// ReceiveFrom receives object from the given receiver. If the given
21+
// receiver is not a supported type, this function should return
22+
// ErrIncompatibleReceiver.
23+
ReceiveFrom(Receiver) (int, error)
24+
}
25+
26+
// SenderTo defines a type which can directly send objects
27+
// from a sender.
28+
type SenderTo interface {
29+
// SendTo sends object to the given sender. If the given
30+
// sender is not a supported type, this function should return
31+
// ErrIncompatibleSender.
32+
SendTo(Sender) (int, error)
33+
}
34+
735
// Copy copies from a receiver to a sender until an EOF is
836
// received. The number of copies made is returned along
937
// with any error that may have halted copying prior to an EOF.
1038
func Copy(w Sender, r Receiver) (int, error) {
39+
if senderTo, ok := r.(SenderTo); ok {
40+
if n, err := senderTo.SendTo(w); err != ErrIncompatibleSender {
41+
return n, err
42+
}
43+
}
44+
if receiverFrom, ok := w.(ReceiverFrom); ok {
45+
if n, err := receiverFrom.ReceiveFrom(r); err != ErrIncompatibleReceiver {
46+
return n, err
47+
}
48+
}
49+
1150
var n int
1251
for {
13-
m := make(map[string]interface{})
52+
var m interface{}
1453
err := r.Receive(&m)
1554
if err != nil {
1655
if err == io.EOF {

0 commit comments

Comments
 (0)