client-call-serverstreaming.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /// {{ method|methodDescriptorName }} (Server Streaming)
  2. {{ access }} final class {{ .|call:file,service,method }} {
  3. private var call : Call
  4. /// Create a call.
  5. fileprivate init(_ channel: Channel) {
  6. self.call = channel.makeCall("{{ .|path:file,service,method }}")
  7. }
  8. /// Call this once with the message to send. Nonblocking.
  9. fileprivate func start(request: {{ method|input }},
  10. metadata: Metadata,
  11. completion: @escaping (CallResult) -> ())
  12. throws -> {{ .|call:file,service,method }} {
  13. let requestData = try request.serializedData()
  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. {{ access }} func receive() throws -> {{ method|output }} {
  22. var returnError : {{ .|clienterror:file,service }}?
  23. var returnResponse : {{ method|output }}!
  24. let sem = DispatchSemaphore(value: 0)
  25. do {
  26. try receive() {response, error in
  27. returnResponse = response
  28. returnError = error
  29. sem.signal()
  30. }
  31. _ = sem.wait(timeout: DispatchTime.distantFuture)
  32. }
  33. if let returnError = returnError {
  34. throw returnError
  35. }
  36. return returnResponse
  37. }
  38. /// Call this to wait for a result. Nonblocking.
  39. {{ access }} func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws {
  40. do {
  41. try call.receiveMessage() {(responseData) in
  42. if let responseData = responseData {
  43. if let response = try? {{ method|output }}(serializedData:responseData) {
  44. completion(response, nil)
  45. } else {
  46. completion(nil, {{ .|clienterror:file,service }}.invalidMessageReceived)
  47. }
  48. } else {
  49. completion(nil, {{ .|clienterror:file,service }}.endOfStream)
  50. }
  51. }
  52. }
  53. }
  54. /// Cancel the call.
  55. {{ access }} func cancel() {
  56. call.cancel()
  57. }
  58. }