client-call-bidistreaming.swift 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. let done = NSCondition()
  10. try self.call.start(.bidiStreaming,
  11. metadata:metadata)
  12. {callResult in
  13. done.lock()
  14. done.signal()
  15. done.unlock()
  16. }
  17. done.lock()
  18. done.wait()
  19. done.unlock()
  20. return self
  21. }
  22. public func Receive() throws -> {{ method|output }} {
  23. var returnError : {{ .|clienterror:protoFile,service }}?
  24. var returnMessage : {{ method|output }}!
  25. let done = NSCondition()
  26. do {
  27. try call.receiveMessage() {(data) in
  28. if let data = data {
  29. returnMessage = try? {{ method|output }}(protobuf:data)
  30. if returnMessage == nil {
  31. returnError = {{ .|clienterror:protoFile,service }}.invalidMessageReceived
  32. }
  33. } else {
  34. returnError = {{ .|clienterror:protoFile,service }}.endOfStream
  35. }
  36. done.lock()
  37. done.signal()
  38. done.unlock()
  39. }
  40. done.lock()
  41. done.wait()
  42. done.unlock()
  43. }
  44. if let returnError = returnError {
  45. throw returnError
  46. }
  47. return returnMessage
  48. }
  49. public func Send(_ message:{{ method|input }}) throws {
  50. let messageData = try message.serializeProtobuf()
  51. try call.sendMessage(data:messageData)
  52. }
  53. public func CloseSend() throws {
  54. let done = NSCondition()
  55. try call.close() {
  56. done.lock()
  57. done.signal()
  58. done.unlock()
  59. }
  60. done.lock()
  61. done.wait()
  62. done.unlock()
  63. }
  64. }