client-call-clientstreaming.swift 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /// {{ method|methodDescriptorName }} (Client 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 to start a call. Nonblocking.
  9. fileprivate func start(metadata:Metadata, completion:@escaping (CallResult)->())
  10. throws -> {{ .|call:file,service,method }} {
  11. try self.call.start(.clientStreaming, metadata:metadata, completion:completion)
  12. return self
  13. }
  14. /// Call this to send each message in the request stream. Nonblocking.
  15. {{ access }} func send(_ message:{{ method|input }}, errorHandler:@escaping (Error)->()) throws {
  16. let messageData = try message.serializedData()
  17. try call.sendMessage(data:messageData, errorHandler:errorHandler)
  18. }
  19. /// Call this to close the connection and wait for a response. Blocking.
  20. {{ access }} func closeAndReceive() throws -> {{ method|output }} {
  21. var returnError : {{ .|clienterror:file,service }}?
  22. var returnResponse : {{ method|output }}!
  23. let sem = DispatchSemaphore(value: 0)
  24. do {
  25. try closeAndReceive() {response, error in
  26. returnResponse = response
  27. returnError = error
  28. sem.signal()
  29. }
  30. _ = sem.wait(timeout: DispatchTime.distantFuture)
  31. } catch (let error) {
  32. throw error
  33. }
  34. if let returnError = returnError {
  35. throw returnError
  36. }
  37. return returnResponse
  38. }
  39. /// Call this to close the connection and wait for a response. Nonblocking.
  40. {{ access }} func closeAndReceive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->())
  41. throws {
  42. do {
  43. try call.receiveMessage() {(responseData) in
  44. if let responseData = responseData,
  45. let response = try? {{ method|output }}(serializedData:responseData) {
  46. completion(response, nil)
  47. } else {
  48. completion(nil, {{ .|clienterror:file,service }}.invalidMessageReceived)
  49. }
  50. }
  51. try call.close(completion:{})
  52. } catch (let error) {
  53. throw error
  54. }
  55. }
  56. /// Cancel the call.
  57. {{ access }} func cancel() {
  58. call.cancel()
  59. }
  60. }