server-session-serverstreaming.swift 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // {{ method|methodDescriptorName }} (Server Streaming)
  2. {{ access }} final class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
  3. private var provider : {{ .|provider:file,service }}
  4. /// Create a session.
  5. fileprivate init(handler:gRPC.Handler, provider: {{ .|provider:file,service }}) {
  6. self.provider = provider
  7. super.init(handler:handler)
  8. }
  9. /// Send a message. Nonblocking.
  10. {{ access }} func send(_ response: {{ method|output }}, completion: @escaping ()->()) throws {
  11. try handler.sendResponse(message:response.serializedData()) {completion()}
  12. }
  13. /// Run the session. Internal.
  14. fileprivate func run(queue:DispatchQueue) throws {
  15. try self.handler.receiveMessage(initialMetadata:initialMetadata) {(requestData) in
  16. if let requestData = requestData {
  17. do {
  18. let requestMessage = try {{ method|input }}(serializedData:requestData)
  19. // to keep providers from blocking the server thread,
  20. // we dispatch them to another queue.
  21. queue.async {
  22. do {
  23. try self.provider.{{ method|methodDescriptorName|lowercase }}(request:requestMessage, session: self)
  24. try self.handler.sendStatus(statusCode:self.statusCode,
  25. statusMessage:self.statusMessage,
  26. trailingMetadata:self.trailingMetadata,
  27. completion:{})
  28. } catch (let error) {
  29. print("error: \(error)")
  30. }
  31. }
  32. } catch (let error) {
  33. print("error: \(error)")
  34. }
  35. }
  36. }
  37. }
  38. }