60 lines
1.3 KiB
Swift
60 lines
1.3 KiB
Swift
|
|
// retoor <retoor@molodetz.nl>
|
||
|
|
|
||
|
|
import Foundation
|
||
|
|
|
||
|
|
enum IpcCommand: String, Codable {
|
||
|
|
case addCheck
|
||
|
|
case removeCheck
|
||
|
|
case updateCheck
|
||
|
|
case listChecks
|
||
|
|
case getMetrics
|
||
|
|
case ping
|
||
|
|
case shutdown
|
||
|
|
}
|
||
|
|
|
||
|
|
struct IpcRequest: Codable {
|
||
|
|
let reqId: Int
|
||
|
|
let command: IpcCommand
|
||
|
|
let payload: [String: String]?
|
||
|
|
}
|
||
|
|
|
||
|
|
struct CheckTarget: Codable {
|
||
|
|
let uid: String
|
||
|
|
let type: String
|
||
|
|
let target: String
|
||
|
|
let intervalSeconds: Int
|
||
|
|
let port: Int?
|
||
|
|
let protocolType: String?
|
||
|
|
}
|
||
|
|
|
||
|
|
struct IpcResponse: Codable {
|
||
|
|
let reqId: Int
|
||
|
|
let kind: String
|
||
|
|
let payload: String?
|
||
|
|
let checks: [CheckTarget]?
|
||
|
|
let metrics: [MetricSample]?
|
||
|
|
let error: String?
|
||
|
|
}
|
||
|
|
|
||
|
|
struct MetricSample: Codable {
|
||
|
|
let checkUid: String
|
||
|
|
let timestamp: Double
|
||
|
|
let latencyMs: Double
|
||
|
|
let status: String
|
||
|
|
let statusCode: Int
|
||
|
|
let errorMessage: String?
|
||
|
|
}
|
||
|
|
|
||
|
|
enum IpcProtocol {
|
||
|
|
static func readRequest(from line: String) -> IpcRequest? {
|
||
|
|
guard let data = line.data(using: .utf8) else { return nil }
|
||
|
|
return try? JSONDecoder().decode(IpcRequest.self, from: data)
|
||
|
|
}
|
||
|
|
|
||
|
|
static func writeResponse(_ response: IpcResponse) -> String? {
|
||
|
|
let encoder = JSONEncoder()
|
||
|
|
guard let data = try? encoder.encode(response) else { return nil }
|
||
|
|
return String(data: data, encoding: .utf8)
|
||
|
|
}
|
||
|
|
}
|