client-call-bidistreaming.swift 1.6 KB

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