Error Scenarios
Error messages play a crucial role in helping users understand and resolve issues they encounter while using an application. While triggering any event if anything goes wrong you would be receiving the error within your result object i.e KssIdpResultObject.
The following details specify under what circumstances and which specific errors would be triggered, enabling users to implement appropriate handling for iOS, Android, and Flutter.
Swift/iOS
public struct KssIdpResultObject {
public let status: KssIdpStatus
public let userId: String
public let traceContext: TraceContext?
}
public enum KssIdpStatus {
case success(message: String, resultStatus: ResultStatus? = .success )
case eventFailed(status: KSMEventStatusType, errorDescription: String, line: Int)
case requestFailed(status: KSMCreateHttpCommonRequestStatus, httpStatus: Int, errorModel: KssIdpErrorModel, line: Int)
case biometricError(errorCode: Int, errorDescription: String)
}
public struct KssIdpErrorModel {
public let subsystem: Int
public let code: String
public let description: String
public let parameters: [String: String]
}
KssIdpStatus: eventFailed
This status would be retrieved when there is any error from MC(Master Controller). For instance, it might occur if the application fails to receive the GetAstClientDataResultEvent in response to the GetAstClientDataEvent, Another potential scenario is when the status obtained from the Master Controller result event is not success.
KssIdpStatus: requestFailed
This status would be retrieved when the result status of the CreateHttpCommonRequestEvent is not successful or when the data becomes null upon parsing the responseBody of the CreateHttpCommonRequestResultEvent.
Android/Kotlin
data class KssIdpResultObject(
val status: KssIdpStatus,
val kssIdpError: KssIdpResult?
)
enum class KssIdpStatus {
SUCCESS,
EVENT_FAILED,
REQUEST_FAILED
}
KssIdpResult can be either of below mentioned types:
- KssIdpEventFailed
- KssIdpRequestFailed
KssIdpEventFailed
This error type is typically triggered when there is any error from MC(Master Controller). For instance, it might occur if the application fails to receive the GetAstClientDataResultEvent in response to the GetAstClientDataEvent, Another potential scenario is when the status obtained from the Master Controller result event is not success.
In this scenario, the status would be retrieved as EVENT_FAILED within the KssIdpResultObject.
class KssIdpEventFailed(
val status : StatusType,
val errorDescription: String,
val errorCode: String
): KssIdpResult() {}
KssIdpRequestFailed
This error type is typically triggered when the result status of the CreateHttpCommonRequestEvent is not successful or when the data becomes null upon parsing the responseBody of the CreateHttpCommonRequestResultEvent.
In this scenario, the status would be retrieved as REQUEST_FAILED within the KssIdpResultObject.
class KssIdpRequestFailed(
val status: CreateHttpCommonRequestResultEvent.Status,
val httpStatus: Int,
val error: KssIdpErrorModel
): KssIdpResult()
KssIdpErrorModel
This model contains additional information about what went wrong when sending a KssIdp Request.
data class KssIdpErrorModel(
var subSystem: String,
var code: String,
var description: String,
var parameters: MutableMap<String, String>
)
Flutter/Dart
final class KssIdpResult {
final KssIdpStatus status;
final String? userId;
KssIdpResult(this.status, this.userId);
}
abstract class KssIdpStatus {}
class KssIdpStatusSuccess extends KssIdpStatus {}
class KssIdpStatusEventFailed extends KssIdpStatus {
final StatusType statusType;
final String errorDescription;
KssIdpStatusEventFailed(this.statusType, this.errorDescription);
}
class KssIdpStatusRequestFailed extends KssIdpStatus {
final CreateHttpCommonRequestStatus httpCommonRequestStatus;
final String errorDescription;
final int httpStatus;
final KssIdpErrorModel errorModel;
KssIdpStatusRequestFailed(this.errorDescription, this.httpCommonRequestStatus,
this.httpStatus, this.errorModel);
}
final class KssIdpErrorModel {
final int subsystem;
final String code;
final String description;
final Map<String, String> parameters;
KssIdpErrorModel(this.subsystem, this.code, this.description, this.parameters);
}
KssIdpStatusEventFailed
This error type is typically triggered when there is any error from MC(Master Controller). For instance, it might occur if the application fails to receive the GetAstClientDataResultEvent in response to the GetAstClientDataEvent, Another potential scenario is when the status obtained from the Master Controller result event is not success.
KssIdpStatusRequestFailed
This error type is typically triggered when the result status of the CreateHttpCommonRequestEvent is not successful or when the data becomes null upon parsing the responseBody of the CreateHttpCommonRequestResultEvent.
Example Usage
Android/Kotlin
We suggest to first check the KssIdpStatus of the received KssIdpResultObject. Then cast the contained KssIdpResult to KssIdpEventFailed in case of KssIdpStatus.EVENT_FAILED, or to KssIdpRequestFailed in case of KssIdpStatus.REQUEST_FAILED.
override fun onResultReceived(result: KssIdpResultObject) {
when (result.status) {
KssIdpStatus.SUCCESS -> {}
KssIdpStatus.EVENT_FAILED -> {
val kssIdpEventFailed = (result.kssIdpError as KssIdpEventFailed)
val errorDescription: String = kssIdpEventFailed.errorDescription
val errorCode: String = kssIdpEventFailed.errorCode
val status: com.kobil.wrapper.events.StatusType = kssIdpEventFailed.status
}
KssIdpStatus.REQUEST_FAILED -> {
val kssIdpRequestFailedError = (result.kssIdpError as KssIdpRequestFailed)
val kssIdpErrorModel: KssIdpErrorModel = kssIdpRequestFailedError.error
val httpStatus: Int = kssIdpRequestFailedError.httpStatus
val status: com.kobil.wrapper.events.CreateHttpCommonRequestResultEvent.Status = kssIdpRequestFailedError.status
// kssIdpErrorModel contains additional information about what went wrong with the KssIdp Request.
kssIdpErrorModel.subSystem
kssIdpErrorModel.code
kssIdpErrorModel.description
kssIdpErrorModel.parameters
}
}
}
Flutter/Dart
For Flutter, check the runtime type of the KssIdpStatus within the KssIdpResult to determine the error type and handle accordingly.
void handleKssIdpResult(KssIdpResult result) {
switch (result.status.runtimeType) {
case KssIdpStatusSuccess:
print("✅ Operation successful");
// Handle success
break;
case KssIdpStatusEventFailed:
final eventFailed = result.status as KssIdpStatusEventFailed;
print("❌ Event failed: ${eventFailed.errorDescription}");
print(" Status Type: ${eventFailed.statusType}");
// Handle MC SDK error
_handleMcSdkError(eventFailed);
break;
case KssIdpStatusRequestFailed:
final requestFailed = result.status as KssIdpStatusRequestFailed;
print("❌ Request failed: ${requestFailed.errorDescription}");
print(" HTTP Status: ${requestFailed.httpStatus}");
print(" Request Status: ${requestFailed.httpCommonRequestStatus}");
// Handle HTTP request error with detailed error model
_handleHttpRequestError(requestFailed);
break;
default:
print("❓ Unknown error type");
}
}
void _handleMcSdkError(KssIdpStatusEventFailed eventFailed) {
// Handle Master Controller SDK errors
// e.g., GetAstClientDataEvent failures, invalid status responses
switch (eventFailed.statusType) {
case StatusType.failed:
// Show generic error message
break;
case StatusType.cancelled:
// Handle cancellation
break;
default:
// Handle other status types
}
}
void _handleHttpRequestError(KssIdpStatusRequestFailed requestFailed) {
final errorModel = requestFailed.errorModel;
print("Error Details:");
print(" Subsystem: ${errorModel.subsystem}");
print(" Code: ${errorModel.code}");
print(" Description: ${errorModel.description}");
print(" Parameters: ${errorModel.parameters}");
// Handle HTTP common request errors
// e.g., network issues, server errors, parsing failures
}
Swift/iOS
private func handleNewResult(newResultObject: KssIdpResultObject) {
let actionResult: ActionResult
let status = newResultObject.status
let event: KSMSetAuthorisationCodeResultEvent
switch status {
case .success(let message, let resultStatus):
event = resultStatus == .letter_sent_success ? KSMSetAuthorisationCodeResultEvent(status: .KSMFAILED): KSMSetAuthorisationCodeResultEvent(status: .KSMOK)
let suc = resultStatus == .letter_sent_success ? false : true
if(!suc) {
actionResult = ActionResult(title: "kssidp", success: suc, error: message, duration: 0, event: event, onActionCompleted: {
appCoordinator.navigateToRootViewController()
})
} else {
actionResult = ActionResult(title: "kssidp", success: suc, error: nil, duration: 0, event: event)
}
EnableAuthenticationModeModel().updateCurrent(mode: AuthenticationModeModel().current)
case let .eventFailed(status, errorDescription, line):
event = KSMSetAuthorisationCodeResultEvent(status: status)
actionResult = ActionResult(title: "kssIdpModel.error.idpErrorTitle".localized(table: localizedTable),
success: false,
error: nil,
duration: 0,
event: event)
case let .requestFailed(httpCommonRequestStatus, httpStatus, errorModel, line):
let errorText = handleRequestFailure(status: httpCommonRequestStatus, httpStatus: httpStatus, errorModel: errorModel)
event = KSMSetAuthorisationCodeResultEvent(status: .KSMFAILED)
actionResult = ActionResult(title: "kssIdpModel.error.idpErrorTitle".localized(table: localizedTable),
success: false,
error: errorText.localized(table: localizedTable),
duration: 0,
event: event,
onActionCompleted: {
appCoordinator.navigateToRootViewController()
})
case let .biometricError(errorCode, errorDescription):
event = KSMSetAuthorisationCodeResultEvent(status: .KSMFAILED)
actionResult = ActionResult(title: "kssIdpModel.error.idpErrorTitle".localized(table: localizedTable),
success: false,
error: errorDescription,
duration: 0,
event: event)
@unknown default:
event = KSMSetAuthorisationCodeResultEvent(status: .KSMFAILED)
actionResult = ActionResult(title: "kssIdpModel.error.idpErrorTitle".localized(table: localizedTable),
success: false,
error: "Unexpected error",
duration: 0,
event: event)
}
}