client-call-serverstreaming.swift 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 start(request: {{ method|input }},
  10. metadata: Metadata,
  11. completion: @escaping (CallResult) -> ())
  12. throws -> {{ .|call:protoFile,service,method }} {
  13. let requestData = try request.serializeProtobuf()
  14. try call.start(.serverStreaming,
  15. metadata:metadata,
  16. message:requestData,
  17. completion:completion)
  18. return self
  19. }
  20. /// Call this to wait for a result. Blocking.
  21. public func receive() throws -> {{ method|output }} {
  22. var returnError : {{ .|clienterror:protoFile,service }}?
  23. var response : {{ method|output }}!
  24. let sem = DispatchSemaphore(value: 0)
  25. do {
  26. try call.receiveMessage() {(responseData) in
  27. if let responseData = responseData {
  28. response = try? {{ method|output }}(protobuf:responseData)
  29. if response == nil {
  30. returnError = {{ .|clienterror:protoFile,service }}.invalidMessageReceived
  31. }
  32. } else {
  33. returnError = {{ .|clienterror:protoFile,service }}.endOfStream
  34. }
  35. sem.signal()
  36. }
  37. _ = sem.wait(timeout: DispatchTime.distantFuture)
  38. }
  39. if let returnError = returnError {
  40. throw returnError
  41. }
  42. return response
  43. }
  44. /// Call this to wait for a result. Nonblocking.
  45. public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:protoFile,service }}?)->()) throws {
  46. do {
  47. try call.receiveMessage() {(responseData) in
  48. if let responseData = responseData {
  49. if let response = try? {{ method|output }}(protobuf:responseData) {
  50. completion(response, nil)
  51. } else {
  52. completion(nil, {{ .|clienterror:protoFile,service }}.invalidMessageReceived)
  53. }
  54. } else {
  55. completion(nil, {{ .|clienterror:protoFile,service }}.endOfStream)
  56. }
  57. }
  58. }
  59. }
  60. }