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