CallHandlerFactory.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright 2020, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import NIO
  17. import SwiftProtobuf
  18. // We can't use a 'where' clause on 'init's to constrain the generic requirements of a type. Instead
  19. // we'll use static methods on this factory.
  20. public enum CallHandlerFactory {
  21. public typealias UnaryContext<Response> = UnaryResponseCallContext<Response>
  22. public typealias UnaryEventObserver<Request, Response> = (Request) -> EventLoopFuture<Response>
  23. public static func makeUnary<Request: Message, Response: Message>(
  24. callHandlerContext: CallHandlerContext,
  25. eventObserverFactory: @escaping (UnaryContext<Response>) -> UnaryEventObserver<Request, Response>
  26. ) -> UnaryCallHandler<Request, Response> {
  27. return UnaryCallHandler(
  28. serializer: ProtobufSerializer(),
  29. deserializer: ProtobufDeserializer(),
  30. callHandlerContext: callHandlerContext,
  31. eventObserverFactory: eventObserverFactory
  32. )
  33. }
  34. public static func makeUnary<Request: GRPCPayload, Response: GRPCPayload>(
  35. callHandlerContext: CallHandlerContext,
  36. eventObserverFactory: @escaping (UnaryContext<Response>) -> UnaryEventObserver<Request, Response>
  37. ) -> UnaryCallHandler<Request, Response> {
  38. return UnaryCallHandler(
  39. serializer: GRPCPayloadSerializer(),
  40. deserializer: GRPCPayloadDeserializer(),
  41. callHandlerContext: callHandlerContext,
  42. eventObserverFactory: eventObserverFactory
  43. )
  44. }
  45. public typealias ClientStreamingContext<Response> = UnaryResponseCallContext<Response>
  46. public typealias ClientStreamingEventObserver<Request> = EventLoopFuture<(StreamEvent<Request>) -> Void>
  47. public static func makeClientStreaming<Request: Message, Response: Message>(
  48. callHandlerContext: CallHandlerContext,
  49. eventObserverFactory: @escaping (ClientStreamingContext<Response>) -> ClientStreamingEventObserver<Request>
  50. ) -> ClientStreamingCallHandler<Request, Response> {
  51. return ClientStreamingCallHandler(
  52. serializer: ProtobufSerializer(),
  53. deserializer: ProtobufDeserializer(),
  54. callHandlerContext: callHandlerContext,
  55. eventObserverFactory: eventObserverFactory
  56. )
  57. }
  58. public static func makeClientStreaming<Request: GRPCPayload, Response: GRPCPayload>(
  59. callHandlerContext: CallHandlerContext,
  60. eventObserverFactory: @escaping (ClientStreamingContext<Response>) -> ClientStreamingEventObserver<Request>
  61. ) -> ClientStreamingCallHandler<Request, Response> {
  62. return ClientStreamingCallHandler(
  63. serializer: GRPCPayloadSerializer(),
  64. deserializer: GRPCPayloadDeserializer(),
  65. callHandlerContext: callHandlerContext,
  66. eventObserverFactory: eventObserverFactory
  67. )
  68. }
  69. public typealias ServerStreamingContext<Response> = StreamingResponseCallContext<Response>
  70. public typealias ServerStreamingEventObserver<Request> = (Request) -> EventLoopFuture<GRPCStatus>
  71. public static func makeServerStreaming<Request: Message, Response: Message>(
  72. callHandlerContext: CallHandlerContext,
  73. eventObserverFactory: @escaping (ServerStreamingContext<Response>) -> ServerStreamingEventObserver<Request>
  74. ) -> ServerStreamingCallHandler<Request, Response> {
  75. return ServerStreamingCallHandler(
  76. serializer: ProtobufSerializer(),
  77. deserializer: ProtobufDeserializer(),
  78. callHandlerContext: callHandlerContext,
  79. eventObserverFactory: eventObserverFactory
  80. )
  81. }
  82. public static func makeServerStreaming<Request: GRPCPayload, Response: GRPCPayload>(
  83. callHandlerContext: CallHandlerContext,
  84. eventObserverFactory: @escaping (ServerStreamingContext<Response>) -> ServerStreamingEventObserver<Request>
  85. ) -> ServerStreamingCallHandler<Request, Response> {
  86. return ServerStreamingCallHandler(
  87. serializer: GRPCPayloadSerializer(),
  88. deserializer: GRPCPayloadDeserializer(),
  89. callHandlerContext: callHandlerContext,
  90. eventObserverFactory: eventObserverFactory
  91. )
  92. }
  93. public typealias BidirectionalStreamingContext<Response> = StreamingResponseCallContext<Response>
  94. public typealias BidirectionalStreamingEventObserver<Request> = EventLoopFuture<(StreamEvent<Request>) -> Void>
  95. public static func makeBidirectionalStreaming<Request: Message, Response: Message>(
  96. callHandlerContext: CallHandlerContext,
  97. eventObserverFactory: @escaping (BidirectionalStreamingContext<Response>) -> BidirectionalStreamingEventObserver<Request>
  98. ) -> BidirectionalStreamingCallHandler<Request, Response> {
  99. return BidirectionalStreamingCallHandler(
  100. serializer: ProtobufSerializer(),
  101. deserializer: ProtobufDeserializer(),
  102. callHandlerContext: callHandlerContext,
  103. eventObserverFactory: eventObserverFactory
  104. )
  105. }
  106. public static func makeBidirectionalStreaming<Request: GRPCPayload, Response: GRPCPayload>(
  107. callHandlerContext: CallHandlerContext,
  108. eventObserverFactory: @escaping (BidirectionalStreamingContext<Response>) -> BidirectionalStreamingEventObserver<Request>
  109. ) -> BidirectionalStreamingCallHandler<Request, Response> {
  110. return BidirectionalStreamingCallHandler(
  111. serializer: GRPCPayloadSerializer(),
  112. deserializer: GRPCPayloadDeserializer(),
  113. callHandlerContext: callHandlerContext,
  114. eventObserverFactory: eventObserverFactory
  115. )
  116. }
  117. }