-
-
Save whyrusleeping/811593acb302b90a1b8c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func (ns *NetworkSimulator) NewConnPair(local, remote peer.ID) (*Conn, *Conn, error) { | |
r1, w1 := io.Pipe() | |
r2, w2 := io.Pipe() | |
laddr := ns.listeners[local].Multiaddr() | |
raddr := ns.listeners[remote].Multiaddr() | |
ltok := make(chan struct{}, 1) | |
rtok := make(chan struct{}, 1) | |
ltok <- struct{}{} | |
rtok <- struct{}{} | |
return &Conn{ | |
read: r1, | |
write: w2, | |
local: local, | |
remote: remote, | |
laddr: laddr, | |
raddr: raddr, | |
writeToken: ltok, | |
}, | |
&Conn{ | |
read: r2, | |
write: w1, | |
local: remote, | |
remote: local, | |
laddr: raddr, | |
raddr: laddr, | |
writeToken: rtok, | |
}, nil | |
} | |
type Conn struct { | |
read io.ReadCloser | |
write io.WriteCloser | |
local peer.ID | |
remote peer.ID | |
laddr ma.Multiaddr | |
raddr ma.Multiaddr | |
writeToken chan struct{} | |
} | |
func (c *Conn) Read(b []byte) (int, error) { | |
return c.read.Read(b) | |
} | |
func (c *Conn) Write(b []byte) (int, error) { | |
t, ok := <-c.writeToken | |
if !ok { | |
return 0, errors.New("attempted to write on a closed connection") | |
} | |
go func() { | |
c.write.Write(b) | |
c.writeToken <- t | |
}() | |
return len(b), nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment