client-call-serverstreaming.swift 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // {{ method.name }} (Server 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. // Call this once with the message to send.
  9. fileprivate func run(request: {{ method|input }}, metadata: Metadata) throws -> {{ .|call:protoFile,service,method }} {
  10. let requestData = try request.serializeProtobuf()
  11. let done = NSCondition()
  12. try call.start(.serverStreaming,
  13. metadata:metadata,
  14. message:requestData)
  15. {callResult in
  16. done.lock()
  17. done.signal()
  18. done.unlock()
  19. }
  20. done.lock()
  21. done.wait()
  22. done.unlock()
  23. return self
  24. }
  25. // Call this to wait for a result. Blocks.
  26. public func Receive() throws -> {{ method|output }} {
  27. var returnError : {{ .|clienterror:protoFile,service }}?
  28. var response : {{ method|output }}!
  29. let done = NSCondition()
  30. do {
  31. try call.receiveMessage() {(responseData) in
  32. if let responseData = responseData {
  33. response = try? {{ method|output }}(protobuf:responseData)
  34. if response == 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 response
  52. }
  53. }