server-session-serverstreaming.swift 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // {{ method|methodDescriptorName }} (Server Streaming)
  2. {{ access }} protocol {{ .|session:file,service,method }} : {{ .|service:file,service }}Session {
  3. /// Send a message. Nonblocking.
  4. func send(_ response: {{ method|output }}, completion: @escaping ()->()) throws
  5. }
  6. fileprivate final class {{ .|session:file,service,method }}Impl : {{ .|service:file,service }}SessionImpl, {{ .|session:file,service,method }} {
  7. private var provider : {{ .|provider:file,service }}
  8. /// Create a session.
  9. init(handler:Handler, provider: {{ .|provider:file,service }}) {
  10. self.provider = provider
  11. super.init(handler:handler)
  12. }
  13. func send(_ response: {{ method|output }}, completion: @escaping ()->()) throws {
  14. try handler.sendResponse(message:response.serializedData()) {completion()}
  15. }
  16. /// Run the session. Internal.
  17. func run(queue:DispatchQueue) throws {
  18. try self.handler.receiveMessage(initialMetadata:initialMetadata) {(requestData) in
  19. if let requestData = requestData {
  20. do {
  21. let requestMessage = try {{ method|input }}(serializedData:requestData)
  22. // to keep providers from blocking the server thread,
  23. // we dispatch them to another queue.
  24. queue.async {
  25. do {
  26. try self.provider.{{ method|methodDescriptorName|lowercase }}(request:requestMessage, session: self)
  27. try self.handler.sendStatus(statusCode:self.statusCode,
  28. statusMessage:self.statusMessage,
  29. trailingMetadata:self.trailingMetadata,
  30. completion:{})
  31. } catch (let error) {
  32. print("error: \(error)")
  33. }
  34. }
  35. } catch (let error) {
  36. print("error: \(error)")
  37. }
  38. }
  39. }
  40. }
  41. }
  42. //-{% if generateTestStubs %}
  43. /// Simple fake implementation of {{ .|session:file,service,method }} that returns a previously-defined set of results
  44. /// and stores sent values for later verification.
  45. class {{ .|session:file,service,method }}TestStub : {{ .|service:file,service }}SessionTestStub, {{ .|session:file,service,method }} {
  46. var outputs: [{{ method|output }}] = []
  47. func send(_ response: {{ method|output }}, completion: @escaping ()->()) throws {
  48. outputs.append(response)
  49. }
  50. func close() throws { }
  51. }
  52. //-{% endif %}