Browse Source

Add completion handler to Call start() method, rework Echo sample.

Tim Burks 9 years ago
parent
commit
582c2a8242

+ 2 - 2
Examples/Echo/Swift/Echo/EchoService.swift

@@ -113,7 +113,7 @@ public class EchoCollectCall {
 
   // Call this to start a call.
   func start(metadata:Metadata) throws {
-    try self.call.start(metadata: metadata)
+    try self.call.start(metadata: metadata, completion: {})
   }
 
   // Call this to send each message in the request stream.
@@ -151,7 +151,7 @@ public class EchoUpdateCall {
   }
 
   func start(metadata:Metadata) throws {
-    try self.call.start(metadata: metadata)
+    try self.call.start(metadata: metadata, completion:{})
   }
 
   func receiveMessage(callback:@escaping (Echo_EchoResponse?) throws -> Void) throws {

+ 6 - 13
Samples/Echo/Sources/EchoServer.swift

@@ -193,12 +193,13 @@ class BidiStreamingSession : Session {
           self.server.handle(session:self, message:requestMessage)
 
         } else {
+          print("SERVER RECEIVED CLOSE")
           // if we get an empty message (requestData == nil), we close the connection
           try self.handler.sendStatus(statusCode: 0,
                                       statusMessage: "OK",
                                       trailingMetadata: Metadata())
           {
-            self.handler.shutdown()
+            print("SERVER SENT CLOSE")
           }
         }
       }
@@ -278,9 +279,7 @@ class EchoServer {
 class EchoGetServer : UnaryServer {
 
   func handle(message:Echo_EchoRequest) -> Echo_EchoResponse? {
-    var reply = Echo_EchoResponse()
-    reply.text = "Swift echo get: " + message.text
-    return reply
+    return Echo_EchoResponse(text: "Swift echo get: " + message.text)
   }
 }
 
@@ -290,9 +289,7 @@ class EchoExpandServer : ServerStreamingServer {
     let parts = message.text.components(separatedBy: " ")
     var i = 0
     for part in parts {
-      var reply = Echo_EchoResponse()
-      reply.text = "Swift echo expand (\(i)): \(part)"
-      session.sendMessage(message:reply)
+      session.sendMessage(message:Echo_EchoResponse(text:"Swift echo expand (\(i)): \(part)"))
       i += 1
       sleep(1)
     }
@@ -311,9 +308,7 @@ class EchoCollectServer : ClientStreamingServer {
   }
 
   func close(session:ClientStreamingSession) {
-    var reply = Echo_EchoResponse()
-    reply.text = "Swift echo collect: " + result
-    session.sendMessage(message:reply)
+    session.sendMessage(message:Echo_EchoResponse(text:"Swift echo collect: " + result))
   }
 }
 
@@ -321,9 +316,7 @@ class EchoUpdateServer : BidiStreamingServer {
   var i = 0
 
   func handle(session:BidiStreamingSession, message:Echo_EchoRequest) -> Void {
-    var reply = Echo_EchoResponse()
-    reply.text = "Swift echo update (\(i)): \(message.text)"
-    session.sendMessage(message:reply)
+    session.sendMessage(message:Echo_EchoResponse(text:"Swift echo update (\(i)): \(message.text)"))
     i += 1
   }
 }

+ 2 - 2
Samples/Echo/Sources/EchoService.swift

@@ -150,8 +150,8 @@ public class EchoUpdateCall {
     self.call = call
   }
 
-  func start(metadata:Metadata) throws {
-    try self.call.start(metadata: metadata)
+  func start(metadata:Metadata, completion:@escaping (() -> Void)) throws {
+    try self.call.start(metadata: metadata, completion:completion)
   }
 
   func receiveMessage(callback:@escaping (Echo_EchoResponse?) throws -> Void) throws {

+ 49 - 64
Samples/Echo/Sources/main.swift

@@ -40,12 +40,10 @@ print("\(CommandLine.arguments)")
 var server : Bool = false
 
 // client options
-var client_get : Bool = false
-var client_expand : Bool = false
-var client_collect : Bool = false
-var client_update : Bool = false
+var client : String = ""
+var message : String = "Testing 1 2 3"
 
-// other network configuration
+// general configuration
 var useSSL : Bool = false
 
 var i : Int = 0
@@ -58,44 +56,40 @@ while i < Int(CommandLine.argc) {
 
   if arg == "serve" {
     server = true
-  } else if arg == "get" {
-    client_get = true
-  } else if arg == "expand" {
-    client_expand = true
-  } else if arg == "collect" {
-    client_collect = true
-  } else if arg == "update" {
-    client_update = true
+  } else if (arg == "get") || (arg == "expand") || (arg == "collect") || (arg == "update") {
+    client = arg
   } else if arg == "-ssl" {
     useSSL = true
+  } else if arg == "-m" && (i < Int(CommandLine.argc)) {
+    message = CommandLine.arguments[i]
+    i = i + 1
   }
 }
 
-var insecureEchoServer: EchoServer!
-var secureEchoServer: EchoServer!
-
 var done = NSCondition()
 
 gRPC.initialize()
 
 if server {
+  var echoServer: EchoServer!
   if useSSL {
     print("Starting secure server")
-    secureEchoServer = EchoServer(address:"localhost:8443", secure:true)
-    secureEchoServer.start()
+    echoServer = EchoServer(address:"localhost:8443", secure:true)
   } else {
     print("Starting insecure server")
-    insecureEchoServer = EchoServer(address:"localhost:8081", secure:false)
-    insecureEchoServer.start()
+    echoServer = EchoServer(address:"localhost:8081", secure:false)
   }
-  // we never actually exit the server; kill the process to stop it.
+  echoServer.start()
+  // Block to keep the main thread from finishing while the server runs.
+  // This server never exits. Kill the process to stop it.
   done.lock()
   done.wait()
   done.unlock()
 }
 
-if client_get || client_expand || client_collect || client_update {
+if client != "" {
   print("Starting client")
+
   var service : EchoService
   if useSSL {
     let certificateURL = URL(fileURLWithPath:"ssl.crt")
@@ -109,11 +103,10 @@ if client_get || client_expand || client_collect || client_update {
   let requestMetadata = Metadata(["x-goog-api-key":"YOUR_API_KEY",
                                   "x-ios-bundle-identifier":"com.google.echo"])
 
-  if client_get {
+  if client == "get" {
     let getCall = service.get()
 
-    var requestMessage = Echo_EchoRequest()
-    requestMessage.text = "Hello!!!"
+    var requestMessage = Echo_EchoRequest(text:message)
     print("Sending: " + requestMessage.text)
     getCall.perform(request:requestMessage) {(callResult, responseMessage) in
       if let responseMessage = responseMessage {
@@ -125,19 +118,20 @@ if client_get || client_expand || client_collect || client_update {
       done.signal()
       done.unlock()
     }
+    // Wait for the call to complete.
     done.lock()
     done.wait()
     done.unlock()
   }
 
-  if client_expand {
+  if client == "expand" {
     let expandCall = service.expand()
 
     func receiveExpandMessage() throws -> Void {
       try expandCall.receiveMessage() {(responseMessage) in
         if let responseMessage = responseMessage {
-          try receiveExpandMessage() // prepare to receive the next message
-          print(responseMessage.text)
+          try receiveExpandMessage() // prepare to receive the next message in the stream
+          print("Received: " + responseMessage.text)
         } else {
           print("expand closed")
           done.lock()
@@ -147,22 +141,21 @@ if client_get || client_expand || client_collect || client_update {
       }
     }
 
-    var requestMessage = Echo_EchoRequest()
-    requestMessage.text = "Testing One Two Three"
+    let requestMessage = Echo_EchoRequest(text:message)
     print("Sending: " + requestMessage.text)
-    expandCall.perform(request:requestMessage) {(callResult, response) in}
+    expandCall.perform(request:requestMessage) {(callResult, response) in /* do nothing */}
     try receiveExpandMessage()
+    // Wait for the call to complete.
     done.lock()
     done.wait()
     done.unlock()
   }
 
-  if client_collect {
+  if client == "collect" {
     let collectCall = service.collect()
 
-    func sendCollectMessage() {
-      var requestMessage = Echo_EchoRequest()
-      requestMessage.text = "hello"
+    func sendCollectMessage(message: String) {
+      let requestMessage = Echo_EchoRequest(text:message)
       print("Sending: " + requestMessage.text)
       _ = collectCall.sendMessage(message:requestMessage)
     }
@@ -179,35 +172,28 @@ if client_get || client_expand || client_collect || client_update {
           done.lock()
           done.signal()
           done.unlock()
-        } else {
-          print("collect closed")
-          done.lock()
-          done.signal()
-          done.unlock()
         }
       }
     }
     try collectCall.start(metadata:requestMetadata)
     try receiveCollectMessage()
-    sendCollectMessage()
-    sleep(1)
-    sendCollectMessage()
-    sleep(1)
-    sendCollectMessage()
-    sleep(1)
+    let parts = message.components(separatedBy:" ")
+    for part in parts {
+      sendCollectMessage(message:part)
+      sleep(1)
+    }
     sendClose()
-
+    // Wait for the call to complete.
     done.lock()
     done.wait()
     done.unlock()
   }
 
-  if client_update {
+  if client == "update" {
     let updateCall = service.update()
 
-    func sendUpdateMessage() {
-      var requestMessage = Echo_EchoRequest()
-      requestMessage.text = "hello"
+    func sendUpdateMessage(message: String) {
+      let requestMessage = Echo_EchoRequest(text:message)
       print("Sending: " + requestMessage.text)
       _ = updateCall.sendMessage(message:requestMessage)
     }
@@ -222,25 +208,24 @@ if client_get || client_expand || client_collect || client_update {
         try receiveUpdateMessage() // prepare to receive the next message
         if let responseMessage = responseMessage {
           print("Received: " + responseMessage.text)
-        } else {
-          print("update closed")
-          done.lock()
-          done.signal()
-          done.unlock()
         }
       }
     }
 
-    try updateCall.start(metadata:requestMetadata)
+    try updateCall.start(metadata:requestMetadata) {
+      print("update closed")
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
     try receiveUpdateMessage()
-    sendUpdateMessage()
-    sleep(1)
-    sendUpdateMessage()
-    sleep(1)
-    sendUpdateMessage()
-    sleep(1)
+    let parts = message.components(separatedBy:" ")
+    for part in parts {
+      sendUpdateMessage(message:part)
+      sleep(1)
+    }
     sendClose()
-    sleep(1)
+    // Wait for the call to complete.
     done.lock()
     done.wait()
     done.unlock()

+ 9 - 6
Sources/gRPC/Call.swift

@@ -209,7 +209,7 @@ public class Call {
                                                   .sendMessage(messageBuffer),
                                                   .sendCloseFromClient,
                                                   .receiveInitialMetadata
-                                                  ],
+        ],
                                       completion:
         {(operationGroup) in
           if operationGroup.success {
@@ -233,10 +233,12 @@ public class Call {
   /// start a streaming connection
   ///
   /// Parameter metadata: initial metadata to send
-  public func start(metadata: Metadata) throws -> Void {
-    try self.sendInitialMetadata(metadata: metadata)
-    try self.receiveInitialMetadata()
-    try self.receiveStatus()
+  public func start(metadata: Metadata,
+                    completion:@escaping (() -> Void))
+    throws -> Void {
+      try self.sendInitialMetadata(metadata: metadata)
+      try self.receiveInitialMetadata()
+      try self.receiveStatus(completion:completion)
   }
 
   /// send a message over a streaming connection
@@ -335,12 +337,13 @@ public class Call {
   }
 
   // receive status from a streaming connection
-  private func receiveStatus() throws -> Void {
+  private func receiveStatus(completion: @escaping (() -> Void)) throws -> Void {
     let operations = OperationGroup(call:self, operations:[.receiveStatusOnClient])
     {(operationGroup) in
       if operationGroup.success {
         print("status = \(operationGroup.receivedStatusCode()), \(operationGroup.receivedStatusMessage())")
       }
+      completion()
     }
     try self.perform(operations)
   }