client-call-clientstreaming.swift 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /// {{ method.name }} (Client Streaming)
  2. public 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. public 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. public 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. public 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. }