diff --git a/contrib/codecs/broker/server.go b/contrib/codecs/broker/server.go
index 6e76c20a766ba9bbc78dea8d0d312d04d586a8f8..c92f0b31d1c3f16ef9e108ef1a7ec4bc187c01f1 100644
--- a/contrib/codecs/broker/server.go
+++ b/contrib/codecs/broker/server.go
@@ -2,6 +2,7 @@ package broker
 
 import (
 	"context"
+	"log/slog"
 
 	"gfx.cafe/open/jrpc/pkg/server"
 )
@@ -26,7 +27,10 @@ func (s *Server) ServeSpoke(ctx context.Context, stream ServerSpoke) {
 		}
 		cd := NewCodec(req, fn)
 		go func() {
-			s.Server.ServeCodec(ctx, cd)
+			err := s.Server.ServeCodec(ctx, cd)
+			if err != nil {
+				slog.Error("codec err", "err", err)
+			}
 			cd.Close()
 		}()
 	}
diff --git a/contrib/codecs/http/handler.go b/contrib/codecs/http/handler.go
index b3ba7868d044702bbdab0c8df4d1500c9b1a1448..d677dfcad9b60486c90146ccc8467a7f26ab6d8a 100644
--- a/contrib/codecs/http/handler.go
+++ b/contrib/codecs/http/handler.go
@@ -1,6 +1,7 @@
 package http
 
 import (
+	"log/slog"
 	"net/http"
 	"sync"
 
@@ -29,7 +30,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	c := codecPool.Get().(*Codec)
 	c.Reset(w, r)
 	w.Header().Set("content-type", contentType)
-	s.Server.ServeCodec(r.Context(), c)
+	err := s.Server.ServeCodec(r.Context(), c)
+	if err != nil {
+		slog.Error("codec err", "err", err)
+	}
 	go func() {
 		<-c.Closed()
 		codecPool.Put(c)
diff --git a/contrib/codecs/websocket/handler.go b/contrib/codecs/websocket/handler.go
index bbbf8c4fdce35ce5329bfe6f8368a2748f1a8757..7114f0660b409be10994aa02c344170d346a8479 100644
--- a/contrib/codecs/websocket/handler.go
+++ b/contrib/codecs/websocket/handler.go
@@ -1,6 +1,7 @@
 package websocket
 
 import (
+	"log/slog"
 	"net/http"
 
 	"gfx.cafe/open/websocket"
@@ -23,7 +24,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	c := newWebsocketCodec(r.Context(), conn, "", r.Header)
-	s.Server.ServeCodec(r.Context(), c)
+	err = s.Server.ServeCodec(r.Context(), c)
+	if err != nil {
+		slog.Error("codec err", "error", err)
+	}
 }
 
 // WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections.
@@ -41,6 +45,9 @@ func WebsocketHandler(s *server.Server, allowedOrigins []string) http.Handler {
 			return
 		}
 		codec := newWebsocketCodec(r.Context(), conn, r.Host, r.Header)
-		s.ServeCodec(r.Context(), codec)
+		err = s.ServeCodec(r.Context(), codec)
+		if err != nil {
+			slog.Error("codec err", "error", err)
+		}
 	})
 }