make swarm wrap all its messages with a type, filter these later
Jeromy committed
Aug 17, 2014 at 16:05 UTC
f1d232ac0fb2d5352e57005a6f4582885d84cfbb
2 files changed
+50
-6
swarm/swarm.go
+36
-2
@@ -262,8 +262,14 @@ func (s *Swarm) fanOut() {
262
continue
263
}
264
265
+ wrapped, err := Wrap(msg.Data, PBWrapper_DHT_MESSAGE)
266
+ if err != nil {
267
+ s.Error(err)
268
+ continue
269
+ }
270
+
271
// queue it in the connection's buffer
266
- conn.Outgoing.MsgChan <- msg.Data
272
+ conn.Outgoing.MsgChan <- wrapped
273
}
274
}
275
}
@@ -288,8 +294,14 @@ func (s *Swarm) fanIn(conn *Conn) {
294
goto out
295
}
296
297
+ wrapper, err := Unwrap(data)
298
+ if err != nil {
299
+ s.Error(err)
300
+ continue
301
+ }
302
+
303
// wrap it for consumers.
292
- msg := &Message{Peer: conn.Peer, Data: data}
304
+ msg := &Message{Peer: conn.Peer, Data: wrapper.GetMessage()}
305
s.Chan.Incoming <- msg
306
}
307
}
@@ -399,4 +411,26 @@ func (s *Swarm) GetChan() *Chan {
411
return s.Chan
412
}
413
414
+func Wrap(data []byte, typ PBWrapper_MessageType) ([]byte, error) {
415
+ wrapper := new(PBWrapper)
416
+ wrapper.Message = data
417
+ wrapper.Type = &typ
418
+ b, err := proto.Marshal(wrapper)
419
+ if err != nil {
420
+ return nil, err
421
+ }
422
+ return b, nil
423
+}
424
+
425
+func Unwrap(data []byte) (*PBWrapper, error) {
426
+ mes := new(PBWrapper)
427
+ err := proto.Unmarshal(data, mes)
428
+ if err != nil {
429
+ return nil, err
430
+ }
431
+
432
+ return mes, nil
433
+}
434
+
435
+// Temporary to ensure that the Swarm always matches the Network interface as we are changing it
436
var _ Network = &Swarm{}
swarm/swarm_test.go
+14
-4
@@ -14,7 +14,7 @@ func pingListen(listener *net.TCPListener, peer *peer.Peer) {
14
for {
15
c, err := listener.Accept()
16
if err == nil {
17
- fmt.Println("accepeted")
17
+ fmt.Println("accepted")
18
go pong(c, peer)
19
}
20
}
@@ -29,11 +29,21 @@ func pong(c net.Conn, peer *peer.Peer) {
29
fmt.Printf("error %v\n", err)
30
return
31
}
32
- if string(data[:n]) != "ping" {
33
- fmt.Printf("error: didn't receive ping: '%v'\n", data[:n])
32
+ b, err := Unwrap(data[:n])
33
+ if err != nil {
34
+ fmt.Printf("error %v\n", err)
35
+ return
36
+ }
37
+ if string(b.GetMessage()) != "ping" {
38
+ fmt.Printf("error: didn't receive ping: '%v'\n", b.GetMessage())
39
+ return
40
+ }
41
+ data, err = Wrap([]byte("pong"), PBWrapper_DHT_MESSAGE)
42
+ if err != nil {
43
+ fmt.Printf("error %v\n", err)
44
return
45
}
36
- err = mrw.WriteMsg([]byte("pong"))
46
+ err = mrw.WriteMsg(data)
47
if err != nil {
48
fmt.Printf("error %v\n", err)
49
return