codec.go

 1package server
 2
 3import (
 4	"log/slog"
 5	"net/rpc"
 6
 7	msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc/v2"
 8)
 9
10// ServerCodec is a wrapper around msgpackrpc.ServerCodec that adds logging
11// functionality.
12type ServerCodec struct {
13	*msgpackrpc.MsgpackCodec
14	logger *slog.Logger
15}
16
17var _ rpc.ServerCodec = (*ServerCodec)(nil)
18
19// ReadRequestHeader reads the request header and logs it.
20func (c *ServerCodec) ReadRequestHeader(r *rpc.Request) error {
21	err := c.MsgpackCodec.ReadRequestHeader(r)
22	if c.logger != nil {
23		c.logger.Debug("rpc request",
24			slog.String("service_method", r.ServiceMethod),
25			slog.Int("seq", int(r.Seq)),
26		)
27	}
28	return err
29}
30
31// WriteResponse writes the response and logs it.
32func (c *ServerCodec) WriteResponse(r *rpc.Response, body any) error {
33	err := c.MsgpackCodec.WriteResponse(r, body)
34	if c.logger != nil {
35		c.logger.Debug("rpc response",
36			slog.String("service_method", r.ServiceMethod),
37			slog.String("error", r.Error),
38			slog.Int("seq", int(r.Seq)),
39		)
40	}
41	return err
42}