package hook import ( "encoding/ascii85" "errors" "tunnel/pkg/netstring" "tunnel/pkg/server/env" "tunnel/pkg/server/opts" "tunnel/pkg/server/queue" ) type b85Hook struct{} func (b85Hook) Send(rq, wq queue.Q) error { e := netstring.NewEncoder(wq.Writer()) for b := range rq { out := make([]byte, ascii85.MaxEncodedLen(len(b))) n := ascii85.Encode(out, b) e.Encode(string(out[:n])) } return nil } func (b85Hook) Recv(rq, wq queue.Q) error { d := netstring.NewDecoder(rq.Reader()) for { s, err := d.Decode() if err != nil { return err } out := make([]byte, 4*len(s)) if n, m, err := ascii85.Decode(out, []byte(s), true); err != nil { return err } else if m != len(s) { return errors.New("decode fail: partial consumption") } else { wq <- out[:n] } } } func (h b85Hook) Open(env.Env) (interface{}, error) { return h, nil } func newB85Hook(opts.Opts, env.Env) (hook, error) { return b85Hook{}, nil } func init() { register("b85", newB85Hook) }