package hook import ( "encoding/ascii85" "errors" "tunnel/pkg/netstring" "tunnel/pkg/server/queue" ) type b85Pipe struct{} func (b85Pipe) 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 (b85Pipe) 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 init() { registerPipe("b85", b85Pipe{}) }