commit b2c9fcac5e9d560e4e8165ef2f1cf8f2cf67f967
Author: Serene Han <keroserene+git(a)gmail.com>
Date: Tue May 24 12:56:09 2016 -0700
webRTCConn has better seam with BytesLogger interface
---
client/client_test.go | 6 +-----
client/snowflake.go | 14 +++++++++++++-
client/util.go | 23 +++++++++++++++++++----
client/webrtc.go | 16 ++++++----------
4 files changed, 39 insertions(+), 20 deletions(-)
diff --git a/client/client_test.go b/client/client_test.go
index 93e0422..1ccf206 100644
--- a/client/client_test.go
+++ b/client/client_test.go
@@ -109,11 +109,7 @@ func TestSnowflakeClient(t *testing.T) {
})
Convey("WebRTC Connection", func() {
- c := new(webRTCConn)
- c.BytesInfo = &BytesInfo{
- inboundChan: make(chan int), outboundChan: make(chan int),
- inbound: 0, outbound: 0, inEvents: 0, outEvents: 0,
- }
+ c := NewWebRTCConnection(nil, nil)
So(c.buffer.Bytes(), ShouldEqual, nil)
Convey("Can construct a WebRTCConn", func() {
diff --git a/client/snowflake.go b/client/snowflake.go
index 61864ca..464420c 100644
--- a/client/snowflake.go
+++ b/client/snowflake.go
@@ -66,6 +66,7 @@ type SnowflakeChannel interface {
// updated once multiplexed transport on a single circuit is available.
type Peers struct {
Tongue
+ BytesLogger
snowflakeChan chan *webRTCConn
current *webRTCConn
@@ -88,6 +89,7 @@ func (p *Peers) FindSnowflake() (*webRTCConn, error) {
return nil, errors.New(s)
}
connection, err := p.Catch()
+ connection.BytesLogger = p.BytesLogger
if err != nil {
return nil, err
}
@@ -96,7 +98,11 @@ func (p *Peers) FindSnowflake() (*webRTCConn, error) {
// TODO: Needs fixing.
func (p *Peers) Count() int {
- return len(p.snowflakeChan)
+ count := 0
+ if p.current != nil {
+ count = 1
+ }
+ return count + len(p.snowflakeChan)
}
// Close all remote peers.
@@ -257,6 +263,12 @@ func main() {
remotes := NewPeers(SnowflakeCapacity)
broker := NewBrokerChannel(brokerURL, frontDomain, CreateBrokerTransport())
+ remotes.BytesLogger = &BytesSyncLogger{
+ inboundChan: make(chan int, 5), outboundChan: make(chan int, 5),
+ inbound: 0, outbound: 0, inEvents: 0, outEvents: 0,
+ }
+ go remotes.BytesLogger.Log()
+
remotes.Tongue = WebRTCDialer{broker}
go ConnectLoop(remotes)
diff --git a/client/util.go b/client/util.go
index 6a2b6de..73f0f50 100644
--- a/client/util.go
+++ b/client/util.go
@@ -29,7 +29,22 @@ func (i *IceServerList) Set(s string) error {
return nil
}
-type BytesInfo struct {
+type BytesLogger interface {
+ Log()
+ AddOutbound(int)
+ AddInbound(int)
+}
+
+// Default BytesLogger does nothing.
+type BytesNullLogger struct{}
+
+func (b BytesNullLogger) Log() {}
+func (b BytesNullLogger) AddOutbound(amount int) {}
+func (b BytesNullLogger) AddInbound(amount int) {}
+
+// BytesSyncLogger uses channels to safely log from multiple sources with output
+// occuring at reasonable intervals.
+type BytesSyncLogger struct {
outboundChan chan int
inboundChan chan int
outbound int
@@ -39,7 +54,7 @@ type BytesInfo struct {
isLogging bool
}
-func (b *BytesInfo) Log() {
+func (b *BytesSyncLogger) Log() {
b.isLogging = true
var amount int
output := func() {
@@ -76,14 +91,14 @@ func (b *BytesInfo) Log() {
}
}
-func (b *BytesInfo) AddOutbound(amount int) {
+func (b *BytesSyncLogger) AddOutbound(amount int) {
if !b.isLogging {
return
}
b.outboundChan <- amount
}
-func (b *BytesInfo) AddInbound(amount int) {
+func (b *BytesSyncLogger) AddInbound(amount int) {
if !b.isLogging {
return
}
diff --git a/client/webrtc.go b/client/webrtc.go
index e01cbf7..a47ac19 100644
--- a/client/webrtc.go
+++ b/client/webrtc.go
@@ -29,7 +29,8 @@ type webRTCConn struct {
index int
closed bool
- *BytesInfo
+
+ BytesLogger
}
func (c *webRTCConn) Read(b []byte) (int, error) {
@@ -38,7 +39,7 @@ func (c *webRTCConn) Read(b []byte) (int, error) {
// Writes bytes out to the snowflake proxy.
func (c *webRTCConn) Write(b []byte) (int, error) {
- c.BytesInfo.AddOutbound(len(b))
+ c.BytesLogger.AddOutbound(len(b))
if nil == c.snowflake {
log.Printf("Buffered %d bytes --> WebRTC", len(b))
c.buffer.Write(b)
@@ -99,13 +100,8 @@ func NewWebRTCConnection(config *webrtc.Configuration,
connection.errorChannel = make(chan error, 1)
connection.reset = make(chan struct{}, 1)
- // TODO: Separate out.
- // Log every few seconds.
- connection.BytesInfo = &BytesInfo{
- inboundChan: make(chan int, 5), outboundChan: make(chan int, 5),
- inbound: 0, outbound: 0, inEvents: 0, outEvents: 0,
- }
- go connection.BytesInfo.Log()
+ // Override with something that's not NullLogger to have real logging.
+ connection.BytesLogger = &BytesNullLogger{}
// Pipes remain the same even when DataChannel gets switched.
connection.recvPipe, connection.writePipe = io.Pipe()
@@ -224,7 +220,7 @@ func (c *webRTCConn) establishDataChannel() error {
if len(msg) <= 0 {
log.Println("0 length message---")
}
- c.BytesInfo.AddInbound(len(msg))
+ c.BytesLogger.AddInbound(len(msg))
n, err := c.writePipe.Write(msg)
if err != nil {
// TODO: Maybe shouldn't actually close.