/
buse.go
73 lines (59 loc) 路 1.26 KB
/
buse.go
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package buse
import (
"bufio"
"context"
"encoding/json"
"io"
"net"
"github.com/go-errors/errors"
"github.com/itchio/butler/comm"
"github.com/sourcegraph/jsonrpc2"
)
type Server struct {
}
func NewServer() *Server {
return &Server{}
}
func (s *Server) Serve(ctx context.Context, lis net.Listener, h jsonrpc2.Handler, opt ...jsonrpc2.ConnOpt) error {
conn, err := lis.Accept()
if err != nil {
return errors.Wrap(err, 0)
}
jc := jsonrpc2.NewConn(ctx, jsonrpc2.NewBufferedStream(conn, LFObjectCodec{}), h, opt...)
comm.Debugf("buse: Accepted connection!")
<-jc.DisconnectNotify()
comm.Debugf("buse: Disconected!")
return nil
}
type LFObjectCodec struct{}
var separator = []byte("\n")
func (LFObjectCodec) WriteObject(stream io.Writer, obj interface{}) error {
data, err := json.Marshal(obj)
if err != nil {
return err
}
if _, err := stream.Write(data); err != nil {
return err
}
if _, err := stream.Write(separator); err != nil {
return err
}
return nil
}
func (LFObjectCodec) ReadObject(stream *bufio.Reader, v interface{}) error {
var buf []byte
scanLoop:
for {
b, err := stream.ReadByte()
if err != nil {
return err
}
switch b {
case '\n':
break scanLoop
default:
buf = append(buf, b)
}
}
return json.Unmarshal(buf, v)
}