@@ -8,10 +8,67 @@ import (
88 "strconv"
99 "strings"
1010
11+ "google.golang.org/grpc/codes"
12+ "google.golang.org/grpc/status"
13+
1114 "github.com/livekit/protocol/utils/xtwirp"
1215)
1316
14- var _ xtwirp.ErrorMeta = (* SIPStatus )(nil )
17+ var (
18+ _ xtwirp.ErrorMeta = (* SIPStatus )(nil )
19+ _ error = (* SIPStatus )(nil )
20+ )
21+
22+ func (p SIPStatusCode ) ShortName () string {
23+ return strings .TrimPrefix (p .String (), "SIP_STATUS_" )
24+ }
25+
26+ func (p * SIPStatus ) Error () string {
27+ if p .Status != "" {
28+ return fmt .Sprintf ("sip status: %d: %s" , p .Code , p .Status )
29+ }
30+ return fmt .Sprintf ("sip status: %d (%s)" , p .Code , p .Code .ShortName ())
31+ }
32+
33+ func (p * SIPStatus ) GRPCStatus () * status.Status {
34+ msg := p .Status
35+ if msg == "" {
36+ msg = p .Code .ShortName ()
37+ }
38+ var code = codes .Internal
39+ switch p .Code {
40+ case SIPStatusCode_SIP_STATUS_OK :
41+ return status .New (codes .OK , "OK" )
42+ case SIPStatusCode_SIP_STATUS_REQUEST_TERMINATED :
43+ code = codes .Aborted
44+ case SIPStatusCode_SIP_STATUS_BAD_REQUEST ,
45+ SIPStatusCode_SIP_STATUS_NOTFOUND ,
46+ SIPStatusCode_SIP_STATUS_ADDRESS_INCOMPLETE ,
47+ SIPStatusCode_SIP_STATUS_AMBIGUOUS ,
48+ SIPStatusCode_SIP_STATUS_BAD_EXTENSION ,
49+ SIPStatusCode_SIP_STATUS_EXTENSION_REQUIRED :
50+ code = codes .InvalidArgument
51+ case SIPStatusCode_SIP_STATUS_REQUEST_TIMEOUT ,
52+ SIPStatusCode_SIP_STATUS_GATEWAY_TIMEOUT :
53+ code = codes .DeadlineExceeded
54+ case SIPStatusCode_SIP_STATUS_SERVICE_UNAVAILABLE ,
55+ SIPStatusCode_SIP_STATUS_TEMPORARILY_UNAVAILABLE ,
56+ SIPStatusCode_SIP_STATUS_BUSY_HERE ,
57+ SIPStatusCode_SIP_STATUS_GLOBAL_BUSY_EVERYWHERE ,
58+ SIPStatusCode_SIP_STATUS_NOT_IMPLEMENTED ,
59+ SIPStatusCode_SIP_STATUS_GLOBAL_DECLINE :
60+ code = codes .Unavailable
61+ case SIPStatusCode_SIP_STATUS_PROXY_AUTH_REQUIRED ,
62+ SIPStatusCode_SIP_STATUS_UNAUTHORIZED ,
63+ SIPStatusCode_SIP_STATUS_FORBIDDEN :
64+ code = codes .PermissionDenied
65+ }
66+ st := status .New (code , fmt .Sprintf ("sip status %d: %s" , p .Code , msg ))
67+ if st2 , err := st .WithDetails (p ); err == nil {
68+ return st2
69+ }
70+ return st
71+ }
1572
1673func (p * SIPStatus ) TwirpErrorMeta () map [string ]string {
1774 status := p .Status
0 commit comments