summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/server/module/split.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/pkg/server/module/split.go b/pkg/server/module/split.go
new file mode 100644
index 0000000..138814f
--- /dev/null
+++ b/pkg/server/module/split.go
@@ -0,0 +1,57 @@
+package module
+
+import (
+ "errors"
+ "strconv"
+ "tunnel/pkg/server/env"
+ "tunnel/pkg/server/opts"
+ "tunnel/pkg/server/queue"
+)
+
+const splitDefaultSize = 1024
+
+var errBadSize = errors.New("bad size value")
+
+type splitModule struct {
+ size int
+}
+
+func (m *splitModule) Send(rq, wq queue.Q) error {
+ for b := range rq {
+ var upto int
+
+ for n := 0; n < len(b); n = upto {
+ upto += m.size
+
+ if upto > len(b) {
+ upto = len(b)
+ }
+
+ wq <- b[n:upto]
+ }
+ }
+
+ return nil
+}
+
+func (m *splitModule) Open(env.Env) (Pipe, Pipe) {
+ return m.Send, nil
+}
+
+func newSplitModule(opts opts.Opts, env env.Env) (module, error) {
+ size := splitDefaultSize
+
+ if s, ok := opts["size"]; ok {
+ var err error
+
+ if size, err = strconv.Atoi(s); err != nil || size <= 0 {
+ return nil, errBadSize
+ }
+ }
+
+ return &splitModule{size: size}, nil
+}
+
+func init() {
+ register("split", newSplitModule)
+}