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