43 lines
628 B
Go
43 lines
628 B
Go
package tunnel
|
|
|
|
type Connection struct {
|
|
RX <-chan *DataFrame
|
|
TX chan<- *DataFrame
|
|
ID ID
|
|
closed bool
|
|
}
|
|
|
|
func (c *Connection) Read(p []byte) (int, error) {
|
|
df, ok := <-c.RX
|
|
if !ok {
|
|
return 0, c.Close()
|
|
}
|
|
return df.Read(p)
|
|
}
|
|
|
|
func (c *Connection) Write(p []byte) (int, error) {
|
|
defer recover()
|
|
df := &DataFrame{
|
|
ID: c.ID,
|
|
Type: TypeNormal,
|
|
}
|
|
n, err := df.Write(p)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
c.TX <- df
|
|
return n, nil
|
|
}
|
|
|
|
func (c *Connection) Close() error {
|
|
defer close(c.TX)
|
|
if !c.closed {
|
|
c.TX <- &DataFrame{
|
|
ID: c.ID,
|
|
Type: TypeClosed,
|
|
}
|
|
}
|
|
c.closed = true
|
|
return nil
|
|
}
|