summaryrefslogtreecommitdiff
path: root/pkg/server/module/module.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/module/module.go')
-rw-r--r--pkg/server/module/module.go48
1 files changed, 48 insertions, 0 deletions
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)
+}