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}