package socket import ( "tunnel/pkg/server/env" "tunnel/pkg/server/queue" ) type autoSocket struct { S } type autoChannel struct { s *autoSocket c chan Channel e env.Env } func newAutoSocket(proto, addr string) (S, error) { s, err := newDialSocket(proto, addr) if err != nil { return s, err } return &autoSocket{s}, nil } func (s *autoSocket) Open(env env.Env) (Channel, error) { c := &autoChannel{ s: s, c: make(chan Channel), e: env, } return c, nil } func (c *autoChannel) String() string { return "auto" } func (c *autoChannel) Send(wq queue.Q) error { if x := <-c.c; x == nil { return nil } else { return x.Send(wq) } } func (c *autoChannel) Recv(rq queue.Q) error { b := <-rq if b == nil { close(c.c) return nil } x, err := c.s.S.Open(c.e) if err != nil { close(c.c) return err } c.c <- x q := queue.New() go func() { q <- b queue.Copy(rq, q) close(q) }() defer q.Dry() return x.Recv(q) } /* TODO */ func (c *autoChannel) Close() error { return nil }