diff --git a/pkg/jsonrpc/jrpc.go b/pkg/jsonrpc/conn.go similarity index 62% rename from pkg/jsonrpc/jrpc.go rename to pkg/jsonrpc/conn.go index c7cb6db238eb40eca84eb59f198920e3f9d8d44f..8bed1b0a6e4f1f9f04595ff3b7474c1fc39e4d50 100644 --- a/pkg/jsonrpc/jrpc.go +++ b/pkg/jsonrpc/conn.go @@ -5,16 +5,19 @@ import ( "io" ) -// http.handler, but for jrpc -type Handler interface { - ServeRPC(w ResponseWriter, r *Request) -} +type Conn interface { + Doer + BatchCaller -// http.HandlerFunc,but for jrpc -type HandlerFunc func(w ResponseWriter, r *Request) + Mounter -func (fn HandlerFunc) ServeRPC(w ResponseWriter, r *Request) { - (fn)(w, r) + io.Closer + Closed() <-chan struct{} +} + +type StreamingConn interface { + Conn + Notifier } type Doer interface { @@ -32,22 +35,3 @@ type Notifier interface { type Mounter interface { Mount(Middleware) } - -type Closeder interface { - Closed() <-chan struct{} -} - -type Conn interface { - Doer - BatchCaller - - Mounter - - io.Closer - Closeder -} - -type StreamingConn interface { - Conn - Notifier -} diff --git a/pkg/jsonrpc/dummy.go b/pkg/jsonrpc/conn_dummy.go similarity index 100% rename from pkg/jsonrpc/dummy.go rename to pkg/jsonrpc/conn_dummy.go diff --git a/pkg/jsonrpc/helper.go b/pkg/jsonrpc/conn_helpers.go similarity index 100% rename from pkg/jsonrpc/helper.go rename to pkg/jsonrpc/conn_helpers.go diff --git a/pkg/jsonrpc/context.go b/pkg/jsonrpc/context.go index 9187fc1c64a395e804a48e562facdd8bf4dd44b1..758693b5a6b5e19b7cf6b7abe76835a187346cbf 100644 --- a/pkg/jsonrpc/context.go +++ b/pkg/jsonrpc/context.go @@ -16,8 +16,3 @@ func ConnFromContext(ctx context.Context) (Conn, bool) { client, ok := ctx.Value(clientContextKey{}).(Conn) return client, ok } - -func StreamingConnFromContext(ctx context.Context) (StreamingConn, bool) { - client, ok := ctx.Value(clientContextKey{}).(StreamingConn) - return client, ok -} diff --git a/pkg/jsonrpc/handler.go b/pkg/jsonrpc/handler.go new file mode 100644 index 0000000000000000000000000000000000000000..799a980e086c190c3e798fb86f6a1e2b6bf8ee47 --- /dev/null +++ b/pkg/jsonrpc/handler.go @@ -0,0 +1,17 @@ +package jsonrpc + +// http.handler, but for jrpc +type Handler interface { + ServeRPC(w ResponseWriter, r *Request) +} + +// type check for handlerfunc +var _ Handler = (HandlerFunc)(nil) + +// http.HandlerFunc,but for jrpc +type HandlerFunc func(w ResponseWriter, r *Request) + +// ServeRPC implements (jsonrpc.Handler).ServeRPC +func (fn HandlerFunc) ServeRPC(w ResponseWriter, r *Request) { + (fn)(w, r) +} diff --git a/pkg/jsonrpc/json.go b/pkg/jsonrpc/json.go index 5935de73df342a01bf639cef4c7e68bf2e1a4244..4ab13f3d9e1837893b9f51da14e20da054a50c40 100644 --- a/pkg/jsonrpc/json.go +++ b/pkg/jsonrpc/json.go @@ -36,7 +36,7 @@ func NewStringReader(x string) io.ReadCloser { return io.NopCloser(strings.NewReader(x)) } -func MarshalMessage(m *Message, enc *jx.Encoder) error { +func MarshalMessage(m *Message, enc *jx.Encoder) (err error) { // use encoder fail := enc.Obj(func(e *jx.Encoder) { e.Field("jsonrpc", func(e *jx.Encoder) { @@ -68,12 +68,19 @@ func MarshalMessage(m *Message, enc *jx.Encoder) error { e.Raw(m.Params) }) } - if m.Result != nil { + if m.Result != nil && err == nil { e.Field("result", func(e *jx.Encoder) { - io.Copy(e, m.Result) + var n int64 + n, err = io.Copy(e, m.Result) + if n == 0 { + e.Null() + } }) } }) + if err != nil { + return err + } if fail { return fmt.Errorf("jx encoding error") }