94 lines
2.6 KiB
Go
94 lines
2.6 KiB
Go
package apiproto
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
)
|
|
|
|
func (x *Error) Error() string {
|
|
return fmt.Sprintf("%d: %s", x.Code, x.Message)
|
|
}
|
|
|
|
// Here we define errors that can be exposed in server API replies.
|
|
var (
|
|
// ErrorInternal means server error, if returned this is a signal
|
|
// that something went wrong with Centrifugo itself.
|
|
ErrorInternal = &Error{
|
|
Code: 100,
|
|
Message: "internal server error",
|
|
}
|
|
// ErrorUnknownChannel means that namespace in channel name does not exist.
|
|
ErrorUnknownChannel = &Error{
|
|
Code: 102,
|
|
Message: "unknown channel",
|
|
}
|
|
// ErrorNotFound means that method sent in command does not exist.
|
|
ErrorNotFound = &Error{
|
|
Code: 104,
|
|
Message: "not found",
|
|
}
|
|
// ErrorBadRequest says that Centrifugo can not parse received data
|
|
// because it is malformed.
|
|
ErrorBadRequest = &Error{
|
|
Code: 107,
|
|
Message: "bad request",
|
|
}
|
|
// ErrorNotAvailable means that resource is not enabled.
|
|
ErrorNotAvailable = &Error{
|
|
Code: 108,
|
|
Message: "not available",
|
|
}
|
|
// ErrorUnrecoverablePosition means that stream does not contain required
|
|
// range of publications to fulfill a history query. This can be happen to
|
|
// expiration, size limitation or due to wrong epoch.
|
|
ErrorUnrecoverablePosition = &Error{
|
|
Code: 112,
|
|
Message: "unrecoverable position",
|
|
}
|
|
// ErrorConflict ...
|
|
ErrorConflict = &Error{
|
|
Code: 113,
|
|
Message: "conflict",
|
|
}
|
|
)
|
|
|
|
func MapErrorToHTTPCode(err *Error) int {
|
|
switch err.Code {
|
|
case ErrorInternal.Code:
|
|
return http.StatusInternalServerError
|
|
case ErrorUnknownChannel.Code, ErrorNotFound.Code:
|
|
return http.StatusNotFound
|
|
case ErrorBadRequest.Code, ErrorNotAvailable.Code:
|
|
return http.StatusBadRequest
|
|
case ErrorUnrecoverablePosition.Code:
|
|
return http.StatusRequestedRangeNotSatisfiable
|
|
case ErrorConflict.Code:
|
|
return http.StatusConflict
|
|
default:
|
|
// Default to Internal Server Error for unmapped errors.
|
|
// In general should be avoided - all new API errors must be explicitly described here.
|
|
return http.StatusInternalServerError
|
|
}
|
|
}
|
|
|
|
func MapErrorToGRPCCode(err *Error) codes.Code {
|
|
switch err.Code {
|
|
case ErrorInternal.Code:
|
|
return codes.Internal
|
|
case ErrorUnknownChannel.Code, ErrorNotFound.Code:
|
|
return codes.NotFound
|
|
case ErrorBadRequest.Code, ErrorNotAvailable.Code:
|
|
return codes.InvalidArgument
|
|
case ErrorUnrecoverablePosition.Code:
|
|
return codes.OutOfRange
|
|
case ErrorConflict.Code:
|
|
return codes.AlreadyExists
|
|
default:
|
|
// Default to Internal Error for unmapped errors.
|
|
// In general should be avoided - all new API errors must be explicitly described here.
|
|
return codes.Internal
|
|
}
|
|
}
|