summaryrefslogtreecommitdiff
path: root/pkg/server/hook/buf.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-03-11 15:26:01 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-03-11 20:07:25 +0300
commit60c6459635d2392d14f75cbbcfaf952cb1b45777 (patch)
tree4cd17cf92d1a50078969446ce4916c715200c0ca /pkg/server/hook/buf.go
parenta18edd22eb72549aefd35db0165111586ff21355 (diff)
add buf hook
Diffstat (limited to 'pkg/server/hook/buf.go')
-rw-r--r--pkg/server/hook/buf.go51
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)
+}