1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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)
}
|