summaryrefslogtreecommitdiff
path: root/pkg/server/module
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/module')
-rw-r--r--pkg/server/module/alpha.go32
-rw-r--r--pkg/server/module/hex.go27
-rw-r--r--pkg/server/module/module.go48
3 files changed, 107 insertions, 0 deletions
diff --git a/pkg/server/module/alpha.go b/pkg/server/module/alpha.go
new file mode 100644
index 0000000..be9032c
--- /dev/null
+++ b/pkg/server/module/alpha.go
@@ -0,0 +1,32 @@
+package module
+
+import (
+ "tunnel/pkg/server/queue"
+ "unicode"
+ "bufio"
+ "io"
+)
+
+func alpha(cb func (rune) rune) pipe {
+ return func (rq, wq queue.Q) error {
+ r := bufio.NewReader(rq.Reader())
+
+ for {
+ c, _, err := r.ReadRune()
+ if err != nil {
+ if err == io.EOF {
+ break
+ }
+ return err
+ }
+ wq <- []byte(string(cb(c)))
+ }
+
+ return nil
+ }
+}
+
+func init() {
+ register("lower", alpha(unicode.ToLower))
+ register("upper", alpha(unicode.ToUpper))
+}
diff --git a/pkg/server/module/hex.go b/pkg/server/module/hex.go
new file mode 100644
index 0000000..2ffd1fc
--- /dev/null
+++ b/pkg/server/module/hex.go
@@ -0,0 +1,27 @@
+package module
+
+import (
+ "tunnel/pkg/server/queue"
+ "encoding/hex"
+)
+
+func hexEncoder(rq, wq queue.Q) error {
+ enc := hex.NewEncoder(wq.Writer())
+
+ for b := range rq {
+ enc.Write(b)
+ }
+
+ return nil
+}
+
+func hexDecoder(rq, wq queue.Q) error {
+ r := hex.NewDecoder(rq.Reader())
+ w := wq.Writer()
+ return queue.IoCopy(r, w)
+}
+
+func init() {
+ register("hex", pipe(hexEncoder))
+ register("unhex", pipe(hexDecoder))
+}
diff --git a/pkg/server/module/module.go b/pkg/server/module/module.go
new file mode 100644
index 0000000..768a87b
--- /dev/null
+++ b/pkg/server/module/module.go
@@ -0,0 +1,48 @@
+package module
+
+import (
+ "tunnel/pkg/server/queue"
+ "fmt"
+ "log"
+)
+
+var modules = map[string]M{}
+
+type pipe func (rq, wq queue.Q) error
+
+type M interface {
+ Open() (pipe, pipe)
+}
+
+type reverse struct {
+ M
+}
+
+func Reverse(m M) M {
+ return &reverse{m}
+}
+
+func (r *reverse) Open() (pipe, pipe) {
+ p1, p2 := r.M.Open()
+ return p2, p1
+}
+
+func (p pipe) Open() (pipe, pipe) {
+ return p, nil
+}
+
+func register(name string, m M) {
+ if _, ok := modules[name]; ok {
+ log.Panicf("duplicate module name '%s'", name)
+ }
+
+ modules[name] = m
+}
+
+func New(name string) (M, error) {
+ if m, ok := modules[name]; ok {
+ return m, nil
+ }
+
+ return nil, fmt.Errorf("unknown module '%s'", name)
+}