client-call-bidistreaming.swift 2.0 KB

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