in Sources/SwiftDocC/Infrastructure/External Data/ExternalReferenceResolverServiceClient.swift [38:92]
func sendAndWait<Request: Codable>(_ request: Request) throws -> Data {
let resultGroup = DispatchGroup()
var result: Result<Data?, Error>?
resultGroup.enter()
serverResponseQueue.async { [weak self] in
guard let self = self else { return }
do {
let encodedRequest = try self.encoder.encode(
ConvertRequestContextWrapper(
convertRequestIdentifier: self.convertRequestIdentifier,
payload: request
)
)
let message = DocumentationServer.Message(
type: "resolve-reference",
clientName: "SwiftDocC",
payload: encodedRequest
)
let messageData = try self.encoder.encode(message)
self.server.process(messageData) { responseData in
defer { resultGroup.leave() }
result = self.decodeMessage(responseData).map(\.payload)
}
} catch {
result = .failure(.failedToEncodeRequest(underlyingError: error))
}
}
guard resultGroup.wait(timeout: .now() + .seconds(Self.responseTimeout)) == .success else {
logError(.timeout)
throw Error.timeout
}
switch result {
case .success(let data?)?:
return data
case .success?:
logError(.missingPayload)
throw Error.missingPayload
case .failure(let error):
logError(error)
throw error
case nil:
logError(.unknownError)
throw Error.unknownError
}
}