client-call-bidistreaming.swift 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // {{ method.name }} (Bidirectional Streaming)
  2. public class {{ .|call:protoFile,service,method }} {
  3. private var call : Call
  4. /// Create a call.
  5. fileprivate init(_ channel: Channel) {
  6. self.call = channel.makeCall("{{ .|path:protoFile,service,method }}")
  7. }
  8. fileprivate func run(metadata:Metadata) throws -> {{ .|call:protoFile,service,method }} {
  9. try self.call.start(.bidiStreaming,
  10. metadata:metadata)
  11. {_ in}
  12. return self
  13. }
  14. public func Receive() throws -> {{ method|output }} {
  15. var returnError : {{ .|clienterror:protoFile,service }}?
  16. var returnMessage : {{ method|output }}!
  17. let done = NSCondition()
  18. do {
  19. try call.receiveMessage() {(data) in
  20. if let data = data {
  21. returnMessage = try? {{ method|output }}(protobuf:data)
  22. if returnMessage == nil {
  23. returnError = {{ .|clienterror:protoFile,service }}.invalidMessageReceived
  24. }
  25. } else {
  26. returnError = {{ .|clienterror:protoFile,service }}.endOfStream
  27. }
  28. done.lock()
  29. done.signal()
  30. done.unlock()
  31. }
  32. done.lock()
  33. done.wait()
  34. done.unlock()
  35. }
  36. if let returnError = returnError {
  37. throw returnError
  38. }
  39. return returnMessage
  40. }
  41. public func Send(_ message:{{ method|input }}) throws {
  42. let messageData = try message.serializeProtobuf()
  43. _ = call.sendMessage(data:messageData)
  44. }
  45. public func CloseSend() throws {
  46. let done = NSCondition()
  47. try call.close() {
  48. done.lock()
  49. done.signal()
  50. done.unlock()
  51. }
  52. done.lock()
  53. done.wait()
  54. done.unlock()
  55. }
  56. }