func sendAndWait()

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
        }
    }