client-call-bidistreaming.swift 1.6 KB

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