From 72c29b552802f9c36c0fe8bbfd38dde8d71e7510 Mon Sep 17 00:00:00 2001 From: a <a@tuxpa.in> Date: Mon, 4 Dec 2023 12:01:51 -0600 Subject: [PATCH] add streamer --- pkg/jsonrpc/message.go | 72 +++++++++++++++++++++++------------------- pkg/server/server.go | 2 +- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/pkg/jsonrpc/message.go b/pkg/jsonrpc/message.go index dfaeacb..67cf082 100644 --- a/pkg/jsonrpc/message.go +++ b/pkg/jsonrpc/message.go @@ -3,57 +3,63 @@ 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() + w io.Writer +} + +func NewStream(w io.Writer) *MessageStream { return &MessageStream{ - w: w, - jx: enc, + w: w, + } +} + +func (m *MessageStream) NewMessage() (*MessageWriter, error) { + _, err := m.w.Write([]byte(`{"jsonrpc":"2.0"`)) + if err != nil { + return nil, err + } + return &MessageWriter{ + w: m.w, }, 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() +type MessageWriter struct { + w io.Writer } -// 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 *MessageWriter) Field(name string, value json.RawMessage) error { + _, err := m.w.Write([]byte(`,"` + name + `":`)) + if err != nil { + return err + } + _, err = m.w.Write(value) + if err != nil { + return err + } + return nil } -func (m *MessageStream) Close() error { +// Result returns a writer that writes to a result field +func (m *MessageWriter) Result() (io.Writer, error) { + _, err := m.w.Write([]byte(`,"result":`)) + if err != nil { + return nil, err + } + return &ResultWriter{w: m.w}, nil +} + +func (m *MessageWriter) Close() error { _, err := m.w.Write([]byte("}")) return err } -type MessageWriter struct { +type ResultWriter struct { w io.Writer } -func (m *MessageWriter) Write(p []byte) (n int, err error) { +func (m *ResultWriter) Write(p []byte) (n int, err error) { return m.w.Write(p) } diff --git a/pkg/server/server.go b/pkg/server/server.go index 67ea3ed..aa3fdee 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -294,7 +294,7 @@ type callEnv struct { func (c *callResponder) send(ctx context.Context, env *callEnv) (err error) { w := c.remote - s, err := jsonrpc.NewStream(w) + s, err := jsonrpc.NewStream(w).NewMessage() if err != nil { return err } -- GitLab