EchoViewController.swift 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. * Copyright 2016, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import AppKit
  17. import SwiftGRPC
  18. class EchoViewController: NSViewController, NSTextFieldDelegate {
  19. @IBOutlet var messageField: NSTextField!
  20. @IBOutlet var sentOutputField: NSTextField!
  21. @IBOutlet var receivedOutputField: NSTextField!
  22. @IBOutlet var addressField: NSTextField!
  23. @IBOutlet var TLSButton: NSButton!
  24. @IBOutlet var callSelectButton: NSSegmentedControl!
  25. @IBOutlet var closeButton: NSButton!
  26. private var service: Echo_EchoServiceClient?
  27. private var expandCall: Echo_EchoExpandCall?
  28. private var collectCall: Echo_EchoCollectCall?
  29. private var updateCall: Echo_EchoUpdateCall?
  30. private var nowStreaming = false
  31. required init?(coder: NSCoder) {
  32. super.init(coder: coder)
  33. }
  34. private var enabled = false
  35. @IBAction func messageReturnPressed(sender _: NSTextField) {
  36. if enabled {
  37. do {
  38. try callServer(address: addressField.stringValue,
  39. host: "example.com")
  40. } catch (let error) {
  41. print(error)
  42. }
  43. }
  44. }
  45. @IBAction func addressReturnPressed(sender _: NSTextField) {
  46. if nowStreaming {
  47. do {
  48. try sendClose()
  49. } catch (let error) {
  50. print(error)
  51. }
  52. }
  53. // invalidate the service
  54. service = nil
  55. }
  56. @IBAction func buttonValueChanged(sender _: NSSegmentedControl) {
  57. if nowStreaming {
  58. do {
  59. try sendClose()
  60. } catch (let error) {
  61. print(error)
  62. }
  63. }
  64. }
  65. @IBAction func closeButtonPressed(sender _: NSButton) {
  66. if nowStreaming {
  67. do {
  68. try sendClose()
  69. } catch (let error) {
  70. print(error)
  71. }
  72. }
  73. }
  74. override func viewDidLoad() {
  75. closeButton.isEnabled = false
  76. // prevent the UI from trying to send messages until gRPC is initialized
  77. DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
  78. self.enabled = true
  79. }
  80. }
  81. func displayMessageSent(_ message: String) {
  82. DispatchQueue.main.async {
  83. self.sentOutputField.stringValue = message
  84. }
  85. }
  86. func displayMessageReceived(_ message: String) {
  87. DispatchQueue.main.async {
  88. self.receivedOutputField.stringValue = message
  89. }
  90. }
  91. func prepareService(address: String, host: String) {
  92. if service != nil {
  93. return
  94. }
  95. if TLSButton.intValue == 0 {
  96. service = Echo_EchoServiceClient(address: address, secure: false)
  97. } else {
  98. let certificateURL = Bundle.main.url(forResource: "ssl",
  99. withExtension: "crt")!
  100. let certificates = try! String(contentsOf: certificateURL)
  101. service = Echo_EchoServiceClient(address: address, certificates: certificates, host: host)
  102. }
  103. if let service = service {
  104. service.host = "example.com" // sample override
  105. service.metadata = Metadata([
  106. "x-goog-api-key": "YOUR_API_KEY",
  107. "x-ios-bundle-identifier": Bundle.main.bundleIdentifier!
  108. ])
  109. }
  110. }
  111. func callServer(address: String, host: String) throws {
  112. prepareService(address: address, host: host)
  113. guard let service = service else {
  114. return
  115. }
  116. if callSelectButton.selectedSegment == 0 {
  117. // NONSTREAMING
  118. var requestMessage = Echo_EchoRequest()
  119. requestMessage.text = messageField.stringValue
  120. displayMessageSent(requestMessage.text)
  121. _ = try service.get(requestMessage) { responseMessage, callResult in
  122. if let responseMessage = responseMessage {
  123. self.displayMessageReceived(responseMessage.text)
  124. } else {
  125. self.displayMessageReceived("No message received. \(callResult)")
  126. }
  127. }
  128. } else if callSelectButton.selectedSegment == 1 {
  129. // STREAMING EXPAND
  130. if !nowStreaming {
  131. do {
  132. var requestMessage = Echo_EchoRequest()
  133. requestMessage.text = messageField.stringValue
  134. expandCall = try service.expand(requestMessage) { call in
  135. print("Completed expand \(call)")
  136. }
  137. try receiveExpandMessages()
  138. displayMessageSent(requestMessage.text)
  139. } catch (let error) {
  140. self.displayMessageReceived("No message received. \(error)")
  141. }
  142. }
  143. } else if callSelectButton.selectedSegment == 2 {
  144. // STREAMING COLLECT
  145. do {
  146. if !nowStreaming {
  147. let collectCall = try service.collect { call in
  148. print("Completed collect \(call)")
  149. }
  150. self.collectCall = collectCall
  151. nowStreaming = true
  152. DispatchQueue.main.async {
  153. self.closeButton.isEnabled = true
  154. }
  155. }
  156. try sendCollectMessage()
  157. } catch (let error) {
  158. self.displayMessageReceived("No message received. \(error)")
  159. }
  160. } else if callSelectButton.selectedSegment == 3 {
  161. // STREAMING UPDATE
  162. do {
  163. if !nowStreaming {
  164. let updateCall = try service.update { call in
  165. print("Completed update \(call)")
  166. }
  167. self.updateCall = updateCall
  168. nowStreaming = true
  169. try receiveUpdateMessages()
  170. DispatchQueue.main.async {
  171. self.closeButton.isEnabled = true
  172. }
  173. }
  174. try sendUpdateMessage()
  175. } catch (let error) {
  176. self.displayMessageReceived("No message received. \(error)")
  177. }
  178. }
  179. }
  180. func receiveExpandMessages() throws {
  181. guard let expandCall = expandCall else {
  182. return
  183. }
  184. try expandCall.receive { response, error in
  185. if let responseMessage = response {
  186. self.displayMessageReceived(responseMessage.text)
  187. try! self.receiveExpandMessages()
  188. } else if let error = error {
  189. switch error {
  190. case .endOfStream:
  191. self.displayMessageReceived("Done.")
  192. default:
  193. self.displayMessageReceived("No message received. \(error)")
  194. }
  195. }
  196. }
  197. }
  198. func sendCollectMessage() throws {
  199. if let collectCall = collectCall {
  200. var requestMessage = Echo_EchoRequest()
  201. requestMessage.text = messageField.stringValue
  202. displayMessageSent(requestMessage.text)
  203. try collectCall.send(requestMessage) { error in print(error) }
  204. }
  205. }
  206. func sendUpdateMessage() throws {
  207. if let updateCall = updateCall {
  208. var requestMessage = Echo_EchoRequest()
  209. requestMessage.text = messageField.stringValue
  210. displayMessageSent(requestMessage.text)
  211. try updateCall.send(requestMessage) { error in print(error) }
  212. }
  213. }
  214. func receiveUpdateMessages() throws {
  215. guard let updateCall = updateCall else {
  216. return
  217. }
  218. try updateCall.receive { response, error in
  219. if let responseMessage = response {
  220. self.displayMessageReceived(responseMessage.text)
  221. try! self.receiveUpdateMessages()
  222. } else if let error = error {
  223. switch error {
  224. case .endOfStream:
  225. self.displayMessageReceived("Done.")
  226. default:
  227. self.displayMessageReceived("No message received. \(error)")
  228. }
  229. }
  230. }
  231. }
  232. func sendClose() throws {
  233. if let updateCall = updateCall {
  234. try updateCall.closeSend {
  235. self.updateCall = nil
  236. self.nowStreaming = false
  237. DispatchQueue.main.async {
  238. self.closeButton.isEnabled = false
  239. }
  240. }
  241. }
  242. if let collectCall = collectCall {
  243. do {
  244. try collectCall.closeAndReceive { response, error in
  245. if let response = response {
  246. self.displayMessageReceived(response.text)
  247. } else if let error = error {
  248. self.displayMessageReceived("No message received. \(error)")
  249. }
  250. self.collectCall = nil
  251. self.nowStreaming = false
  252. DispatchQueue.main.async {
  253. self.closeButton.isEnabled = false
  254. }
  255. }
  256. }
  257. }
  258. }
  259. }