-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathserver.go
More file actions
39 lines (32 loc) · 900 Bytes
/
Copy pathserver.go
File metadata and controls
39 lines (32 loc) · 900 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package drpcsdk
import (
"runtime/debug"
"storj.io/drpc"
"storj.io/drpc/drpcserver"
"cdr.dev/slog/v3"
)
// NewServer constructs a dRPC server that recovers panics from RPC handlers.
func NewServer(logger slog.Logger, handler drpc.Handler, options drpcserver.Options) *drpcserver.Server {
return drpcserver.NewWithOptions(&recoverHandler{
logger: logger,
handler: handler,
}, options)
}
type recoverHandler struct {
logger slog.Logger
handler drpc.Handler
}
func (h *recoverHandler) HandleRPC(stream drpc.Stream, rpc string) (err error) {
defer func() {
if r := recover(); r != nil {
h.logger.Error(stream.Context(),
"panic serving dRPC request (recovered)",
slog.F("rpc", rpc),
slog.F("panic", r),
slog.F("stack", string(debug.Stack())),
)
err = drpc.InternalError.New("panic serving dRPC request")
}
}()
return h.handler.HandleRPC(stream, rpc)
}