|
|
@@ -32,34 +32,45 @@ open class ServerSessionUnaryBase<InputType: Message, OutputType: Message>: Serv
|
|
|
}
|
|
|
|
|
|
public func run() throws {
|
|
|
- try handler.receiveMessage(initialMetadata: initialMetadata) { requestData in
|
|
|
- let handlerThreadQueue = DispatchQueue(label: "SwiftGRPC.ServerSessionUnaryBase.run.handlerThread")
|
|
|
- handlerThreadQueue.async {
|
|
|
- let responseStatus: ServerStatus
|
|
|
- if let requestData = requestData {
|
|
|
- do {
|
|
|
- let requestMessage = try InputType(serializedData: requestData)
|
|
|
- let responseMessage = try self.providerBlock(requestMessage, self)
|
|
|
- try self.handler.call.sendMessage(data: responseMessage.serializedData()) {
|
|
|
- guard let error = $0
|
|
|
- else { return }
|
|
|
- print("ServerSessionUnaryBase.run error sending response: \(error)")
|
|
|
- }
|
|
|
- responseStatus = .ok
|
|
|
- } catch {
|
|
|
- responseStatus = (error as? ServerStatus) ?? .processingError
|
|
|
- }
|
|
|
- } else {
|
|
|
- print("ServerSessionUnaryBase.run empty request data")
|
|
|
- responseStatus = .noRequestData
|
|
|
- }
|
|
|
+ let sendMetadataSignal = DispatchSemaphore(value: 0)
|
|
|
+ var requestData: Data?
|
|
|
+ try handler.receiveMessage(initialMetadata: initialMetadata) {
|
|
|
+ requestData = $0
|
|
|
+ sendMetadataSignal.signal()
|
|
|
+ }
|
|
|
+ sendMetadataSignal.wait()
|
|
|
+
|
|
|
+ let responseStatus: ServerStatus
|
|
|
+ if let requestData = requestData {
|
|
|
+ do {
|
|
|
+ let requestMessage = try InputType(serializedData: requestData)
|
|
|
+ let responseMessage = try self.providerBlock(requestMessage, self)
|
|
|
|
|
|
- do {
|
|
|
- try self.handler.sendStatus(responseStatus)
|
|
|
- } catch {
|
|
|
- print("ServerSessionUnaryBase.run error sending status: \(error)")
|
|
|
+ let sendResponseSignal = DispatchSemaphore(value: 0)
|
|
|
+ var sendResponseError: Error?
|
|
|
+ try self.handler.call.sendMessage(data: responseMessage.serializedData()) {
|
|
|
+ sendResponseError = $0
|
|
|
+ sendResponseSignal.signal()
|
|
|
+ }
|
|
|
+ sendResponseSignal.wait()
|
|
|
+ if let sendResponseError = sendResponseError {
|
|
|
+ print("ServerSessionUnaryBase.run error sending response: \(sendResponseError)")
|
|
|
+ throw sendResponseError
|
|
|
}
|
|
|
+
|
|
|
+ responseStatus = .ok
|
|
|
+ } catch {
|
|
|
+ responseStatus = (error as? ServerStatus) ?? .processingError
|
|
|
}
|
|
|
+ } else {
|
|
|
+ print("ServerSessionUnaryBase.run no request data")
|
|
|
+ responseStatus = .noRequestData
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ try self.handler.sendStatus(responseStatus)
|
|
|
+ } catch {
|
|
|
+ print("ServerSessionUnaryBase.run error sending status: \(error)")
|
|
|
}
|
|
|
}
|
|
|
}
|