You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/SessionSnodeKit/Models/SwarmSnode.swift

56 lines
2.0 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import SessionUtilitiesKit
/// It looks like the structure for the service node returned from `get_snodes_for_pubkey` is different from
/// the usual structure, this type is used as an intemediary to convert to the usual 'Snode' type
// FIXME: Hopefully at some point this different Snode structure will be deprecated and can be removed
internal struct SwarmSnode: Codable {
public enum CodingKeys: String, CodingKey {
case address = "ip"
case port = "port_https" // Note: The 'port' key was deprecated inplace of the 'port_https' key
case ed25519PublicKey = "pubkey_ed25519"
case x25519PublicKey = "pubkey_x25519"
}
let address: String
let port: UInt16
let ed25519PublicKey: String
let x25519PublicKey: String
}
// MARK: - Convenience
extension SwarmSnode {
public init(from decoder: Decoder) throws {
let container: KeyedDecodingContainer<CodingKeys> = try decoder.container(keyedBy: CodingKeys.self)
do {
let address: String = try container.decode(String.self, forKey: .address)
guard address != "0.0.0.0" else { throw SnodeAPIError.invalidIP }
self = SwarmSnode(
address: (address.starts(with: "https://") ? address : "https://\(address)"),
port: try container.decode(UInt16.self, forKey: .port),
ed25519PublicKey: try container.decode(String.self, forKey: .ed25519PublicKey),
x25519PublicKey: try container.decode(String.self, forKey: .x25519PublicKey)
)
}
catch {
SNLog("Failed to parse snode: \(error.localizedDescription).")
throw HTTPError.invalidJSON
}
}
func toSnode() -> Snode {
return Snode(
address: address,
port: port,
ed25519PublicKey: ed25519PublicKey,
x25519PublicKey: x25519PublicKey
)
}
}