Browse Source

Update Mac Echo sample to latest prototype API.

Tim Burks 9 years ago
parent
commit
a1fed9fab9

+ 17 - 14
Examples/Echo/Swift/Echo/EchoServer.swift

@@ -34,7 +34,6 @@ import Foundation
 import gRPC
 import Darwin // for sleep()
 
-
 // This seemed like a nice idea but doesn't work because
 // specific message types are in the protocol signatures.
 // There are also functions in the Session classes that depend
@@ -100,6 +99,15 @@ class ServerStreamingSession : Session {
     try! handler.sendResponse(message:message.serializeProtobuf()) {}
   }
 
+  func close() -> Void {
+    try! self.handler.sendStatus(statusCode:0,
+                                 statusMessage:"OK",
+                                 trailingMetadata:Metadata(),
+                                 completion:{
+
+    })
+  }
+
   func run() {
     do {
       try handler.receiveMessage(initialMetadata:Metadata()) {(requestData) in
@@ -190,7 +198,6 @@ class BidiStreamingSession : Session {
                                       statusMessage: "OK",
                                       trailingMetadata: Metadata())
           {
-            self.handler.shutdown()
           }
         }
       }
@@ -219,8 +226,11 @@ class EchoServer {
     self.address = address
     if secure {
       let certificateURL = Bundle.main.url(forResource: "ssl", withExtension: "crt")!
+      //let certificateURL = URL(fileURLWithPath:"ssl.crt")
       let certificate = try! String(contentsOf: certificateURL)
+
       let keyURL = Bundle.main.url(forResource: "ssl", withExtension: "key")!
+      //let keyURL = URL(fileURLWithPath:"ssl.key")
       let key = try! String(contentsOf: keyURL)
       self.server = gRPC.Server(address:address, key:key, certs:certificate)
     } else {
@@ -270,9 +280,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)
   }
 }
 
@@ -282,12 +290,11 @@ 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)
     }
+    session.close()
   }
 }
 
@@ -302,9 +309,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))
   }
 }
 
@@ -312,9 +317,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
   }
 }

+ 20 - 11
Examples/Echo/Swift/Echo/EchoService.swift

@@ -35,6 +35,12 @@ import gRPC
 
 // all code that follows is to-be-generated
 
+enum EchoResult {
+  case Success(r: Echo_EchoResponse)
+  case Error(e: CallResult)
+}
+
+
 public class EchoGetCall {
   var call : Call
 
@@ -45,7 +51,7 @@ public class EchoGetCall {
   // Call this with the message to send,
   // the callback will be called after the request is received.
   func perform(request: Echo_EchoRequest,
-               callback:@escaping (CallResult, Echo_EchoResponse?) -> Void)
+               callback:@escaping (EchoResult) -> Void)
     -> Void {
       let requestMessageData = try! request.serializeProtobuf()
       let requestMetadata = Metadata()
@@ -53,12 +59,11 @@ public class EchoGetCall {
                         metadata: requestMetadata)
       {(callResult) in
         print("Client received status \(callResult.statusCode) \(callResult.statusMessage!)")
-
         if let messageData = callResult.resultData {
           let responseMessage = try! Echo_EchoResponse(protobuf:messageData)
-          callback(callResult, responseMessage)
+          callback(EchoResult.Success(r: responseMessage))
         } else {
-          callback(callResult, nil)
+          callback(EchoResult.Error(e: callResult))
         }
       }
   }
@@ -101,7 +106,6 @@ public class EchoExpandCall {
       }
     }
   }
-
 }
 
 public class EchoCollectCall {
@@ -112,8 +116,8 @@ public class EchoCollectCall {
   }
 
   // Call this to start a call.
-  func start(metadata:Metadata) throws {
-    try self.call.start(metadata: metadata, completion: {})
+  func start(metadata:Metadata, completion:@escaping (() -> Void)) throws {
+    try self.call.start(metadata: metadata, completion:completion)
   }
 
   // Call this to send each message in the request stream.
@@ -150,8 +154,8 @@ public class EchoUpdateCall {
     self.call = call
   }
 
-  func start(metadata:Metadata) throws {
-    try self.call.start(metadata: metadata, completion:{})
+  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 {
@@ -190,8 +194,13 @@ public class EchoService {
     channel = Channel(address:address, certificates:certificates, host:host)
   }
 
-  func get() -> EchoGetCall {
-    return EchoGetCall(channel.makeCall("/echo.Echo/Get"))
+  func get(_ requestMessage: Echo_EchoRequest,
+           _ completion:@escaping (EchoResult) -> Void) {
+      let call = EchoGetCall(channel.makeCall("/echo.Echo/Get"))
+      call.perform(request:requestMessage) {(result) in
+        let call = call // retain until completion
+        completion(result)
+      }
   }
 
   func expand() -> EchoExpandCall {

+ 17 - 9
Examples/Echo/Swift/Echo/EchoViewController.swift

@@ -140,15 +140,17 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
     if (self.callSelectButton.selectedSegment == 0) {
       // NONSTREAMING
       if let service = service {
-        let call = service.get()
         var requestMessage = Echo_EchoRequest()
         requestMessage.text = self.messageField.stringValue
-        self.displayMessageSent(requestMessage.text)
-        call.perform(request:requestMessage) {(callResult, response) in
-          if let response = response {
-            self.displayMessageReceived(response.text)
-          } else {
-            self.displayMessageReceived("No message received. gRPC Status \(callResult.statusCode): \(callResult.statusMessage)")
+
+        DispatchQueue.global().async {
+          service.get(requestMessage) { result in
+            switch result {
+            case .Success(let responseMessage):
+              self.displayMessageReceived(responseMessage.text)
+            case .Error(let error):
+              self.displayMessageReceived("No message received. \(error)")
+            }
           }
         }
       }
@@ -175,7 +177,10 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
           return
         }
         collectCall = service.collect()
-        try collectCall!.start(metadata:requestMetadata)
+        try collectCall!.start(metadata:requestMetadata) {
+          // this is called when the server closes the connection
+          print("collect closed")
+        }
         try self.receiveCollectMessage()
         nowStreaming = true
         closeButton.isEnabled = true
@@ -189,7 +194,10 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
           return
         }
         updateCall = service.update()
-        try updateCall!.start(metadata:requestMetadata)
+        try updateCall!.start(metadata:requestMetadata) {
+          // this is called when the server closes the connection
+          print("update closed")
+        }
         try self.receiveUpdateMessage()
         nowStreaming = true
         closeButton.isEnabled = true