good morning!!!!

Skip to content
Snippets Groups Projects
Verified Commit 274bd84d authored by a's avatar a
Browse files

tests passed

parent 352c34f5
Branches
Tags
No related merge requests found
Pipeline #32899 failed
package jsonrpc
import (
"encoding/json"
"io"
"github.com/go-faster/jx"
)
// MessageStream is a writer used to write jsonrpc message to a stream
type MessageStream struct {
w io.Writer
jx *jx.Writer
}
func NewStream(w io.Writer) (*MessageStream, error) {
enc := jx.GetWriter()
defer jx.PutWriter(enc)
enc.Grow(4096)
enc.ResetWriter(w)
enc.ObjStart()
enc.FieldStart("jsonrpc")
enc.Str("2.0")
enc.Close()
return &MessageStream{
w: w,
jx: enc,
}, nil
}
func (m *MessageStream) Field(name string, value json.RawMessage) error {
m.jx.ResetWriter(m.w)
m.jx.Comma()
m.jx.FieldStart(name)
m.jx.Raw(value)
return m.jx.Close()
}
// Result returns a writecloser that writes to a result field
func (m *MessageStream) Result() (io.Writer, error) {
m.jx.ResetWriter(m.w)
m.jx.Comma()
m.jx.FieldStart("result")
m.jx.Close()
return &MessageWriter{w: m.w}, nil
}
func (m *MessageStream) Close() error {
_, err := m.w.Write([]byte("}"))
return err
}
type MessageWriter struct {
w io.Writer
}
func (m *MessageWriter) Write(p []byte) (n int, err error) {
return m.w.Write(p)
}
...@@ -294,63 +294,50 @@ type callEnv struct { ...@@ -294,63 +294,50 @@ type callEnv struct {
func (c *callResponder) send(ctx context.Context, env *callEnv) (err error) { func (c *callResponder) send(ctx context.Context, env *callEnv) (err error) {
w := c.remote w := c.remote
enc := jx.GetWriter() s, err := jsonrpc.NewStream(w)
defer jx.PutWriter(enc) if err != nil {
enc.Grow(4096) return err
enc.ResetWriter(w) }
enc.ObjStart() defer s.Close()
enc.FieldStart("jsonrpc")
enc.Str("2.0")
if env.id != nil { if env.id != nil {
enc.Comma() s.Field("id", env.id.RawMessage())
enc.FieldStart("id")
enc.Raw(env.id.RawMessage())
} }
if env.err != nil { if env.err != nil {
enc.Comma() s.Field("error", jsonrpc.MarshalError(env.err))
enc.FieldStart("error") return nil
enc.Raw(jsonrpc.MarshalError(env.err)) }
} else {
// if there is no error, we try to marshal the result // if there is no error, we try to marshal the result
enc.Comma() wr, err := s.Result()
enc.FieldStart("result") if err != nil {
enc.Close() return err
enc.ResetWriter(w) }
if env.v != nil { if env.v == nil {
_, err := wr.Write(jsonrpc.Null)
if err != nil {
return err
}
return nil
}
switch cast := (env.v).(type) { switch cast := (env.v).(type) {
case json.RawMessage: case json.RawMessage:
if len(cast) == 0 { if len(cast) == 0 {
enc.Null()
} else { } else {
enc.Raw(cast) _, err := wr.Write(cast)
if err != nil {
return err
}
} }
case *io.PipeReader: case *io.PipeReader:
_, err := io.Copy(w, cast) _, err := io.Copy(wr, cast)
if err != nil { if err != nil {
return err return err
} }
cast.Close() cast.Close()
case func(e io.Writer) error: case func(e io.Writer) error:
err = cast(w) err = cast(wr)
case func(e *jx.Writer) error:
err = cast(enc)
default: default:
err = jjson.Encode(w, cast) err = jjson.Encode(w, cast)
} }
} else {
enc.Null()
}
}
if env.err == nil && err != nil {
enc.Comma()
enc.FieldStart("error")
enc.Raw(jsonrpc.MarshalError(err))
}
enc.ObjEnd()
err = enc.Close()
if err != nil {
return err
}
return nil return nil
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment