mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-10 18:10:54 +09:00
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package yamux
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anyproto/any-sync/net/connutil"
|
|
"github.com/anyproto/any-sync/net/transport"
|
|
"github.com/hashicorp/yamux"
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
func NewMultiConn(cctx context.Context, luConn *connutil.LastUsageConn, addr string, sess *yamux.Session) transport.MultiConn {
|
|
return &yamuxConn{
|
|
ctx: cctx,
|
|
luConn: luConn,
|
|
addr: addr,
|
|
Session: sess,
|
|
}
|
|
}
|
|
|
|
type yamuxConn struct {
|
|
ctx context.Context
|
|
luConn *connutil.LastUsageConn
|
|
addr string
|
|
*yamux.Session
|
|
}
|
|
|
|
func (y *yamuxConn) Open(ctx context.Context) (conn net.Conn, err error) {
|
|
if conn, err = y.Session.Open(); err != nil {
|
|
return
|
|
}
|
|
conn = connutil.NewTimeout(conn, time.Second*10)
|
|
return
|
|
}
|
|
|
|
func (y *yamuxConn) LastUsage() time.Time {
|
|
return y.luConn.LastUsage()
|
|
}
|
|
|
|
func (y *yamuxConn) Context() context.Context {
|
|
return y.ctx
|
|
}
|
|
|
|
func (y *yamuxConn) Addr() string {
|
|
return y.addr
|
|
}
|
|
|
|
func (y *yamuxConn) Accept() (conn net.Conn, err error) {
|
|
if conn, err = y.Session.Accept(); err != nil {
|
|
if err == yamux.ErrSessionShutdown {
|
|
err = transport.ErrConnClosed
|
|
}
|
|
return
|
|
}
|
|
conn = connutil.NewTimeout(conn, time.Second*10)
|
|
return
|
|
}
|