client-call-clientstreaming.swift 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // {{ method.name }} (Client 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 to start a call.
  9. fileprivate func run(metadata:Metadata) throws -> {{ .|call:protoFile,service,method }} {
  10. try self.call.start(.clientStreaming,
  11. metadata:metadata)
  12. {_ in}
  13. return self
  14. }
  15. // Call this to send each message in the request stream.
  16. public func Send(_ message: {{ method|input }}) throws {
  17. let messageData = try message.serializeProtobuf()
  18. _ = call.sendMessage(data:messageData)
  19. }
  20. // Call this to close the connection and wait for a response. Blocks.
  21. public func CloseAndReceive() throws -> {{ method|output }} {
  22. var returnError : {{ .|clienterror:protoFile,service }}?
  23. var returnMessage : {{ method|output }}!
  24. let done = NSCondition()
  25. do {
  26. try self.receiveMessage() {(responseMessage) in
  27. if let responseMessage = responseMessage {
  28. returnMessage = responseMessage
  29. } else {
  30. returnError = {{ .|clienterror:protoFile,service }}.invalidMessageReceived
  31. }
  32. done.lock()
  33. done.signal()
  34. done.unlock()
  35. }
  36. try call.close(completion:{
  37. print("closed")
  38. })
  39. done.lock()
  40. done.wait()
  41. done.unlock()
  42. } catch (let error) {
  43. print("ERROR B: \(error)")
  44. }
  45. if let returnError = returnError {
  46. throw returnError
  47. }
  48. return returnMessage
  49. }
  50. // Call this to receive a message.
  51. // The callback will be called when a message is received.
  52. // call this again from the callback to wait for another message.
  53. fileprivate func receiveMessage(callback:@escaping ({{ method|output }}?) throws -> Void)
  54. throws {
  55. try call.receiveMessage() {(data) in
  56. guard let data = data else {
  57. try callback(nil)
  58. return
  59. }
  60. guard
  61. let responseMessage = try? {{ method|output }}(protobuf:data)
  62. else {
  63. return
  64. }
  65. try callback(responseMessage)
  66. }
  67. }
  68. }