diff --git a/pkg/jsonrpc/reqresp.go b/pkg/jsonrpc/reqresp.go index 3bd59ef358cecf63b6a8a74b7534dea9c5dbe9fb..3a4aedcf27da6151ebfb96861ab2072bb3ebcdac 100644 --- a/pkg/jsonrpc/reqresp.go +++ b/pkg/jsonrpc/reqresp.go @@ -11,6 +11,12 @@ type ResponseWriter interface { Notify(method string, v any) error } +type StreamingResponseWriter interface { + ResponseWriter + SendStream(func(MessageStreamer) error) error + NotifyStream(func(MessageStreamer) error) error +} + type Request struct { ID *ID `json:"id,omitempty"` Method string `json:"method,omitempty"` diff --git a/pkg/server/responsewriter.go b/pkg/server/responsewriter.go index c643cd53cf9423b7632e191972809e84a177626d..947a0cdce9f9edc89e786026d1695a69008fe932 100644 --- a/pkg/server/responsewriter.go +++ b/pkg/server/responsewriter.go @@ -34,19 +34,19 @@ type streamingRespWriter struct { sendCalled bool } -func (c *streamingRespWriter) SendStream() jsonrpc.MessageStreamer { +func (c *streamingRespWriter) SendStream(fn func(jsonrpc.MessageStreamer) error) error { if c.sendCalled { - return c.sendStream + return jsonrpc.ErrSendAlreadyCalled } c.sendCalled = true if c.done != nil { - c.done() + defer c.done() } - return c.sendStream + return fn(c.sendStream) } -func (c *streamingRespWriter) NotifyStream() jsonrpc.MessageStreamer { - return c.sendStream +func (c *streamingRespWriter) NotifyStream(fn func(jsonrpc.MessageStreamer) error) error { + return fn(c.notifyStream) } func (c *streamingRespWriter) Send(v any, e error) (err error) { @@ -57,7 +57,7 @@ func (c *streamingRespWriter) Send(v any, e error) (err error) { return jsonrpc.ErrSendAlreadyCalled } if c.done != nil { - c.done() + defer c.done() } c.sendCalled = true ce := &callEnv{ diff --git a/readme.md b/readme.md index 7d799ed37d2a8a22cd27c634cf0c1b72bdb7974e..baf9b8fafab035d9bfb01c47c70ccdedbaa8c8fc 100644 --- a/readme.md +++ b/readme.md @@ -45,7 +45,6 @@ so to jrpc, we added a new "feature", which is that batch requests are executed this is a feature that jsonrpc2 does not have, for jsonrpc2 allows any amount of concurrency and evaluation order for batch requests. - ## maybe outdated but somewhat useful contribution info basic structure