diff --git a/pkg/sip/protocol.go b/pkg/sip/protocol.go index 05a3c69d..3a233fa2 100644 --- a/pkg/sip/protocol.go +++ b/pkg/sip/protocol.go @@ -375,7 +375,16 @@ func handleReferNotify(cseq uint32, status int, reason string, referCseq uint32, Code: livekit.SIPStatusCode(status), Status: reason, } - result = psrpc.NewErrorf(psrpc.Canceled, "call transfer failed: %w", st) + // Converts SIP status to GRPC via SIPStatus.GRPCStatus(), then converts to psrpc via ErrorCodeFromGRPC() + errorCode, _ := psrpc.GetErrorCode(st) + if errorCode == psrpc.Internal || errorCode == psrpc.Unavailable { + // Temporarily overwrite the code until we support a direct SIPStatus -> psrpc.ErrorCode conversion + errorCode = psrpc.UpstreamServerError + if status < 500 || status >= 600 { // Common 6xx codes: 603 Declined, 608 Rejected + errorCode = psrpc.UpstreamClientError + } + } + result = psrpc.NewErrorf(errorCode, "call transfer failed: %w", st) } select { case referDone <- result: @@ -413,6 +422,10 @@ func sipStatusForErrorCode(code psrpc.ErrorCode) sip.StatusCode { return sip.StatusServiceUnavailable case psrpc.Unauthenticated: return sip.StatusUnauthorized + case psrpc.UpstreamServerError: + return sip.StatusBadGateway + case psrpc.UpstreamClientError: + return sip.StatusTemporarilyUnavailable default: return sip.StatusInternalServerError }