// fully streaming public class Echo_EchoUpdateSession { var handler : gRPC.Handler var provider : Echo_EchoProvider fileprivate init(handler:gRPC.Handler, provider: Echo_EchoProvider) { self.handler = handler self.provider = provider } public func Receive() throws -> Echo_EchoRequest { let done = NSCondition() var requestMessage : Echo_EchoRequest? try self.handler.receiveMessage() {(requestData) in if let requestData = requestData { requestMessage = try! Echo_EchoRequest(protobuf:requestData) } done.lock() done.signal() done.unlock() } done.lock() done.wait() done.unlock() if requestMessage == nil { throw Echo_EchoServerError.endOfStream } return requestMessage! } public func Send(_ response: Echo_EchoResponse) throws { try handler.sendResponse(message:response.serializeProtobuf()) {} } public func Close() { let done = NSCondition() try! self.handler.sendStatus(statusCode: 0, statusMessage: "OK", trailingMetadata: Metadata()) { done.lock() done.signal() done.unlock() } done.lock() done.wait() done.unlock() } fileprivate func run(queue:DispatchQueue) { do { try self.handler.sendMetadata(initialMetadata:Metadata()) { queue.async { try! self.provider.update(session:self) } } } catch (let callError) { print("grpc error: \(callError)") } } }