Skip to content

Instantly share code, notes, and snippets.

@whyrusleeping
Created May 1, 2015 04:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save whyrusleeping/811593acb302b90a1b8c to your computer and use it in GitHub Desktop.
Save whyrusleeping/811593acb302b90a1b8c to your computer and use it in GitHub Desktop.
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