diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-11 15:26:01 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-03-11 20:07:25 +0300 |
| commit | 60c6459635d2392d14f75cbbcfaf952cb1b45777 (patch) | |
| tree | 4cd17cf92d1a50078969446ce4916c715200c0ca | |
| parent | a18edd22eb72549aefd35db0165111586ff21355 (diff) | |
add buf hook
| -rw-r--r-- | pkg/server/hook/buf.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/pkg/server/hook/buf.go b/pkg/server/hook/buf.go new file mode 100644 index 0000000..0306c73 --- /dev/null +++ b/pkg/server/hook/buf.go @@ -0,0 +1,51 @@ +package hook + +import ( + "bytes" + "time" + "tunnel/pkg/server/queue" +) + +const bufDelay = 1 * time.Millisecond + +func buffering(rq, wq queue.Q) error { + for b := range rq { + var w bytes.Buffer + + t := time.NewTimer(bufDelay) + stop := false + + for !stop { + select { + case x := <-rq: + if len(x) == 0 { + stop = true + break + } + + if w.Len() == 0 { + w.Write(b) + } + + w.Write(x) + + case <-t.C: + stop = true + } + } + + if w.Len() > 0 { + wq <- w.Bytes() + } else { + wq <- b + } + + t.Stop() + } + + return nil +} + +func init() { + registerFunc("buf", buffering) +} |
