client-call-bidistreaming.swift 1.9 KB

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