summaryrefslogtreecommitdiff
path: root/pkg/server/socket/defer.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-04-21 14:54:27 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-04-21 14:54:27 +0300
commitf44d6e1a111154b70aaeac9ffe38beaee2cc5dd7 (patch)
tree03235fde5578abcaa2a22a633572428a73d27d00 /pkg/server/socket/defer.go
parent38b515c5470b74099b85a4f30aef2dce65600818 (diff)
rename auto socket to defer
Diffstat (limited to 'pkg/server/socket/defer.go')
-rw-r--r--pkg/server/socket/defer.go80
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
+}