Select Git revision
Window.swift
MessengerVerifyContact.swift 2.24 KiB
import Foundation
import XCTestDynamicOverlay
import XXClient
public struct MessengerVerifyContact {
public enum Error: Swift.Error, Equatable {
case notConnected
case notLoggedIn
}
public var run: (Contact) throws -> Bool
public func callAsFunction(_ contact: Contact) throws -> Bool {
try run(contact)
}
}
extension MessengerVerifyContact {
public static func live(_ env: MessengerEnvironment) -> MessengerVerifyContact {
MessengerVerifyContact { contact in
guard let e2e = env.e2e() else {
throw Error.notConnected
}
guard let ud = env.ud() else {
throw Error.notLoggedIn
}
let facts = try contact.getFacts()
let verifiedContact: Contact?
if facts.isEmpty {
var lookupResult: Result<Contact, NSError>!
let semaphore = DispatchSemaphore(value: 0)
_ = try env.lookupUD(
params: LookupUD.Params(
e2eId: e2e.getId(),
udContact: try ud.getContact(),
lookupId: try contact.getId(),
singleRequestParamsJSON: env.getSingleUseParams()
),
callback: UdLookupCallback { result in
lookupResult = result
semaphore.signal()
}
)
semaphore.wait()
verifiedContact = try lookupResult.get()
} else {
var searchResult: Result<[Contact], NSError>!
let semaphore = DispatchSemaphore(value: 0)
_ = try env.searchUD(
params: SearchUD.Params(
e2eId: e2e.getId(),
udContact: try ud.getContact(),
facts: facts,
singleRequestParamsJSON: env.getSingleUseParams()
),
callback: UdSearchCallback { result in
searchResult = result
semaphore.signal()
}
)
semaphore.wait()
verifiedContact = try searchResult.get().first
}
guard let verifiedContact = verifiedContact else {
return false
}
return try e2e.verifyOwnership(
received: contact,
verified: verifiedContact,
e2eId: e2e.getId()
)
}
}
}
extension MessengerVerifyContact {
public static let unimplemented = MessengerVerifyContact(
run: XCTUnimplemented("\(Self.self)")
)
}