2022-01-24 17:17:06 +01:00
|
|
|
import Foundation
|
|
|
|
|
|
|
|
/**
|
|
|
|
A result from sending a key to the device.
|
|
|
|
*/
|
2023-12-08 12:39:10 +01:00
|
|
|
enum MessageResult: UInt8 {
|
2022-04-08 13:33:09 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// The message was accepted.
|
|
|
|
case messageAccepted = 0
|
|
|
|
|
|
|
|
/// The web socket received text while waiting for binary data.
|
2022-01-24 17:17:06 +01:00
|
|
|
case textReceived = 1
|
2022-04-08 13:33:09 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// An unexpected socket event occured while performing the exchange.
|
2022-01-24 17:17:06 +01:00
|
|
|
case unexpectedSocketEvent = 2
|
2022-04-08 13:33:09 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// The received message size is invalid.
|
|
|
|
case invalidMessageSizeFromRemote = 3
|
2022-04-07 23:53:25 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// The message signature was incorrect.
|
|
|
|
case invalidSignatureByRemote = 4
|
2023-08-08 15:17:59 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// The server challenge of the message did not match previous messages
|
|
|
|
case serverChallengeMismatch = 5
|
2022-04-07 23:53:25 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// The client challenge of the message did not match previous messages
|
|
|
|
case clientChallengeMismatchFromRemote = 6
|
2022-04-08 13:33:09 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// An unexpected or unsupported message type was received
|
|
|
|
case invalidMessageTypeFromRemote = 7
|
2022-04-08 13:33:09 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// A message is already being processed
|
|
|
|
case tooManyRequests = 8
|
|
|
|
|
|
|
|
/// The received message result was not ``messageAccepted``
|
|
|
|
case invalidMessageResultFromRemote = 9
|
2023-08-09 16:26:07 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
/// An invalid Url parameter was set sending a message to the device over a local connection
|
|
|
|
case invalidUrlParameter = 10
|
|
|
|
|
|
|
|
/// The request took too long to complete
|
|
|
|
case deviceTimedOut = 20
|
|
|
|
|
|
|
|
case noOrInvalidBodyDataInServerRequest = 21
|
|
|
|
|
|
|
|
/// The device is not connected to the server via web socket
|
|
|
|
case deviceNotConnected = 22
|
|
|
|
case serverNotReached = 23
|
|
|
|
case serverUrlInvalid = 24
|
|
|
|
case invalidDeviceResponseSize = 25
|
|
|
|
case invalidSignatureByDevice = 26
|
|
|
|
case noKeyAvailable = 27
|
|
|
|
case unlocked = 28
|
|
|
|
case unknownMessageResultFromDevice = 29
|
|
|
|
|
|
|
|
/// The device sent a message with an invalid client challenge
|
|
|
|
case clientChallengeMismatchFromDevice = 30
|
|
|
|
|
|
|
|
/// A valid server challenge was received
|
|
|
|
case deviceAvailable = 31
|
|
|
|
|
|
|
|
case invalidMessageTypeFromDevice = 32
|
|
|
|
|
|
|
|
/// The url session request returned an unknown response
|
|
|
|
case unexpectedUrlResponseType = 33
|
|
|
|
|
|
|
|
/// The request to the server returned an unhandled HTTP code
|
|
|
|
case unexpectedServerResponseCode = 34
|
|
|
|
|
|
|
|
/// The server produced an internal error (500)
|
|
|
|
case internalServerError = 35
|
|
|
|
|
|
|
|
/// The Sesame server behind the proxy could not be found (502)
|
|
|
|
case serviceBehindProxyUnavailable = 36
|
|
|
|
|
|
|
|
/// The server url could not be found (404)
|
|
|
|
case pathOnServerNotFound = 37
|
|
|
|
|
|
|
|
/// The header with the authentication token was missing or invalid (not a hex string) from a server request.
|
|
|
|
case missingOrInvalidAuthenticationHeader = 38
|
|
|
|
|
|
|
|
/// The authentication token for the server was invalid
|
|
|
|
case invalidServerAuthentication = 39
|
|
|
|
|
|
|
|
/// The device sent a response of invalid size
|
|
|
|
case invalidMessageSizeFromDevice = 40
|
|
|
|
}
|
2023-08-09 16:26:07 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
extension MessageResult: Error {
|
2023-11-10 13:45:42 +01:00
|
|
|
|
2022-01-29 10:36:49 +01:00
|
|
|
}
|
|
|
|
|
2022-04-07 23:53:25 +02:00
|
|
|
extension MessageResult: CustomStringConvertible {
|
2022-04-08 13:33:09 +02:00
|
|
|
|
2022-01-29 10:36:49 +01:00
|
|
|
var description: String {
|
|
|
|
switch self {
|
2023-12-08 12:39:10 +01:00
|
|
|
case .messageAccepted:
|
|
|
|
return "Message accepted"
|
2022-01-29 10:36:49 +01:00
|
|
|
case .textReceived:
|
|
|
|
return "The device received unexpected text"
|
|
|
|
case .unexpectedSocketEvent:
|
|
|
|
return "Unexpected socket event for the device"
|
2023-12-08 12:39:10 +01:00
|
|
|
case .invalidMessageSizeFromRemote:
|
|
|
|
return "Invalid message data from remote"
|
|
|
|
case .invalidSignatureByRemote:
|
2022-04-07 23:53:25 +02:00
|
|
|
return "Message authentication failed"
|
2023-12-08 12:39:10 +01:00
|
|
|
case .noOrInvalidBodyDataInServerRequest:
|
|
|
|
return "Invalid body data in server request"
|
2022-04-07 23:53:25 +02:00
|
|
|
case .deviceNotConnected:
|
2023-12-08 12:39:10 +01:00
|
|
|
return "Device not connected to server"
|
2022-01-29 10:36:49 +01:00
|
|
|
case .deviceTimedOut:
|
|
|
|
return "The device did not respond"
|
2023-12-08 12:39:10 +01:00
|
|
|
case .serverChallengeMismatch:
|
|
|
|
return "Server challenge mismatch"
|
|
|
|
case .clientChallengeMismatchFromRemote:
|
|
|
|
return "Wrong client challenge sent"
|
|
|
|
case .invalidMessageTypeFromRemote:
|
|
|
|
return "Message type from remote invalid"
|
|
|
|
case .tooManyRequests:
|
|
|
|
return "Device busy"
|
2023-08-09 16:26:07 +02:00
|
|
|
case .invalidUrlParameter:
|
|
|
|
return "The url parameter could not be found"
|
2023-12-08 12:39:10 +01:00
|
|
|
case .invalidMessageResultFromRemote:
|
|
|
|
return "Invalid message result"
|
|
|
|
case .serverNotReached:
|
|
|
|
return "Server unavailable"
|
|
|
|
case .serverUrlInvalid:
|
|
|
|
return "Invalid server url"
|
|
|
|
case .invalidDeviceResponseSize:
|
|
|
|
return "Invalid Response size"
|
|
|
|
case .invalidSignatureByDevice:
|
|
|
|
return "Invalid device signature"
|
|
|
|
case .noKeyAvailable:
|
|
|
|
return "No key available"
|
|
|
|
case .unlocked:
|
|
|
|
return "Unlocked"
|
|
|
|
case .unknownMessageResultFromDevice:
|
|
|
|
return "Unknown message result"
|
|
|
|
case .deviceAvailable:
|
|
|
|
return "Device available"
|
|
|
|
case .clientChallengeMismatchFromDevice:
|
|
|
|
return "Device sent invalid client challenge"
|
|
|
|
case .invalidMessageTypeFromDevice:
|
|
|
|
return "Message type from device invalid"
|
|
|
|
case .unexpectedUrlResponseType:
|
|
|
|
return "Unexpected URL response"
|
|
|
|
case .unexpectedServerResponseCode:
|
|
|
|
return "Unexpected server response code"
|
|
|
|
case .internalServerError:
|
|
|
|
return "Internal server error"
|
|
|
|
case .serviceBehindProxyUnavailable:
|
|
|
|
return "Service behind proxy not found"
|
|
|
|
case .pathOnServerNotFound:
|
|
|
|
return "Invalid server path"
|
|
|
|
case .missingOrInvalidAuthenticationHeader:
|
|
|
|
return "Invalid server token format"
|
|
|
|
case .invalidServerAuthentication:
|
|
|
|
return "Invalid server token"
|
|
|
|
case .invalidMessageSizeFromDevice:
|
|
|
|
return "Invalid device message size"
|
2022-01-29 10:36:49 +01:00
|
|
|
}
|
|
|
|
}
|
2022-01-24 17:17:06 +01:00
|
|
|
}
|
2023-08-09 16:26:07 +02:00
|
|
|
|
2023-12-08 12:39:10 +01:00
|
|
|
extension MessageResult: Codable {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-08-09 16:26:07 +02:00
|
|
|
extension MessageResult {
|
|
|
|
|
|
|
|
var encoded: Data {
|
|
|
|
Data([rawValue])
|
|
|
|
}
|
|
|
|
}
|
2023-12-08 12:39:10 +01:00
|
|
|
|
|
|
|
extension MessageResult {
|
|
|
|
|
|
|
|
init(httpCode: Int) {
|
|
|
|
switch httpCode {
|
|
|
|
case 200: self = .messageAccepted
|
|
|
|
case 204: self = .noOrInvalidBodyDataInServerRequest
|
|
|
|
case 403: self = .invalidServerAuthentication
|
|
|
|
case 404: self = .pathOnServerNotFound
|
|
|
|
case 408: self = .deviceTimedOut
|
|
|
|
case 412: self = .deviceNotConnected
|
|
|
|
case 413: self = .invalidMessageSizeFromDevice
|
|
|
|
case 422: self = .missingOrInvalidAuthenticationHeader
|
|
|
|
case 429: self = .tooManyRequests
|
|
|
|
case 500: self = .internalServerError
|
|
|
|
case 501: self = .unexpectedServerResponseCode
|
|
|
|
case 502: self = .serviceBehindProxyUnavailable
|
|
|
|
default: self = .unexpectedServerResponseCode
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var statusCode: Int {
|
|
|
|
switch self {
|
|
|
|
case .messageAccepted: return 200 // ok
|
|
|
|
case .noOrInvalidBodyDataInServerRequest: return 204 // noContent
|
|
|
|
case .invalidServerAuthentication: return 403 // forbidden
|
|
|
|
case .pathOnServerNotFound: return 404 // notFound
|
|
|
|
case .deviceTimedOut: return 408 // requestTimeout
|
|
|
|
case .invalidMessageSizeFromRemote: return 411 // lengthRequired
|
|
|
|
case .deviceNotConnected: return 412 // preconditionFailed
|
|
|
|
case .invalidMessageSizeFromDevice: return 413 // payloadTooLarge
|
|
|
|
case .missingOrInvalidAuthenticationHeader: return 422 // unprocessableEntity
|
|
|
|
case .tooManyRequests: return 429 // tooManyRequests
|
|
|
|
case .internalServerError: return 500 // internalServerError
|
|
|
|
case .unexpectedServerResponseCode: return 501 // notImplemented
|
|
|
|
case .serviceBehindProxyUnavailable: return 502 // badGateway
|
|
|
|
default: return 501 // == unexpectedServerResponseCode
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|