diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-04-21 14:54:27 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-04-21 14:54:27 +0300 |
| commit | f44d6e1a111154b70aaeac9ffe38beaee2cc5dd7 (patch) | |
| tree | 03235fde5578abcaa2a22a633572428a73d27d00 /pkg/server/socket/defer.go | |
| parent | 38b515c5470b74099b85a4f30aef2dce65600818 (diff) | |
rename auto socket to defer
Diffstat (limited to 'pkg/server/socket/defer.go')
| -rw-r--r-- | pkg/server/socket/defer.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/pkg/server/socket/defer.go b/pkg/server/socket/defer.go new file mode 100644 index 0000000..bfb2157 --- /dev/null +++ b/pkg/server/socket/defer.go @@ -0,0 +1,80 @@ +package socket + +import ( + "tunnel/pkg/server/env" + "tunnel/pkg/server/queue" +) + +type deferSocket struct { + S +} + +type deferChannel struct { + s *deferSocket + c chan Channel + e env.Env +} + +func newDeferSocket(proto, addr string) (S, error) { + s, err := newDialSocket(proto, addr) + if err != nil { + return s, err + } + + return &deferSocket{s}, nil +} + +func (s *deferSocket) Open(env env.Env) (Channel, error) { + c := &deferChannel{ + s: s, + c: make(chan Channel), + e: env, + } + + return c, nil +} + +func (c *deferChannel) String() string { + return "defer" +} + +func (c *deferChannel) Send(wq queue.Q) error { + if x := <-c.c; x == nil { + return nil + } else { + return x.Send(wq) + } +} + +func (c *deferChannel) 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 *deferChannel) Close() error { + return nil +} |
