CallHandlerFactory.swift 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. @inlinable
  24. public static func makeUnary<Request: Message, Response: Message>(
  25. callHandlerContext: CallHandlerContext,
  26. interceptors: [ServerInterceptor<Request, Response>] = [],
  27. eventObserverFactory: @escaping (UnaryContext<Response>)
  28. -> UnaryEventObserver<Request, Response>
  29. ) -> UnaryCallHandler<ProtobufDeserializer<Request>, ProtobufSerializer<Response>> {
  30. return UnaryCallHandler(
  31. serializer: ProtobufSerializer(),
  32. deserializer: ProtobufDeserializer(),
  33. callHandlerContext: callHandlerContext,
  34. interceptors: interceptors,
  35. eventObserverFactory: eventObserverFactory
  36. )
  37. }
  38. @inlinable
  39. public static func makeUnary<Request: GRPCPayload, Response: GRPCPayload>(
  40. callHandlerContext: CallHandlerContext,
  41. interceptors: [ServerInterceptor<Request, Response>] = [],
  42. eventObserverFactory: @escaping (UnaryContext<Response>)
  43. -> UnaryEventObserver<Request, Response>
  44. ) -> UnaryCallHandler<GRPCPayloadDeserializer<Request>, GRPCPayloadSerializer<Response>> {
  45. return UnaryCallHandler(
  46. serializer: GRPCPayloadSerializer(),
  47. deserializer: GRPCPayloadDeserializer(),
  48. callHandlerContext: callHandlerContext,
  49. interceptors: interceptors,
  50. eventObserverFactory: eventObserverFactory
  51. )
  52. }
  53. public typealias ClientStreamingContext<Response> = UnaryResponseCallContext<Response>
  54. public typealias ClientStreamingEventObserver<Request> =
  55. EventLoopFuture<(StreamEvent<Request>) -> Void>
  56. @inlinable
  57. public static func makeClientStreaming<Request: Message, Response: Message>(
  58. callHandlerContext: CallHandlerContext,
  59. interceptors: [ServerInterceptor<Request, Response>] = [],
  60. eventObserverFactory: @escaping (ClientStreamingContext<Response>)
  61. -> ClientStreamingEventObserver<Request>
  62. ) -> ClientStreamingCallHandler<ProtobufDeserializer<Request>, ProtobufSerializer<Response>> {
  63. return ClientStreamingCallHandler(
  64. serializer: ProtobufSerializer(),
  65. deserializer: ProtobufDeserializer(),
  66. callHandlerContext: callHandlerContext,
  67. interceptors: interceptors,
  68. eventObserverFactory: eventObserverFactory
  69. )
  70. }
  71. @inlinable
  72. public static func makeClientStreaming<Request: GRPCPayload, Response: GRPCPayload>(
  73. callHandlerContext: CallHandlerContext,
  74. interceptors: [ServerInterceptor<Request, Response>] = [],
  75. eventObserverFactory: @escaping (ClientStreamingContext<Response>)
  76. -> ClientStreamingEventObserver<Request>
  77. ) -> ClientStreamingCallHandler<
  78. GRPCPayloadDeserializer<Request>,
  79. GRPCPayloadSerializer<Response>
  80. > {
  81. return ClientStreamingCallHandler(
  82. serializer: GRPCPayloadSerializer(),
  83. deserializer: GRPCPayloadDeserializer(),
  84. callHandlerContext: callHandlerContext,
  85. interceptors: interceptors,
  86. eventObserverFactory: eventObserverFactory
  87. )
  88. }
  89. public typealias ServerStreamingContext<Response> = StreamingResponseCallContext<Response>
  90. public typealias ServerStreamingEventObserver<Request> = (Request) -> EventLoopFuture<GRPCStatus>
  91. @inlinable
  92. public static func makeServerStreaming<Request: Message, Response: Message>(
  93. callHandlerContext: CallHandlerContext,
  94. interceptors: [ServerInterceptor<Request, Response>] = [],
  95. eventObserverFactory: @escaping (ServerStreamingContext<Response>)
  96. -> ServerStreamingEventObserver<Request>
  97. ) -> ServerStreamingCallHandler<ProtobufDeserializer<Request>, ProtobufSerializer<Response>> {
  98. return ServerStreamingCallHandler(
  99. serializer: ProtobufSerializer(),
  100. deserializer: ProtobufDeserializer(),
  101. callHandlerContext: callHandlerContext,
  102. interceptors: interceptors,
  103. eventObserverFactory: eventObserverFactory
  104. )
  105. }
  106. @inlinable
  107. public static func makeServerStreaming<Request: GRPCPayload, Response: GRPCPayload>(
  108. callHandlerContext: CallHandlerContext,
  109. interceptors: [ServerInterceptor<Request, Response>] = [],
  110. eventObserverFactory: @escaping (ServerStreamingContext<Response>)
  111. -> ServerStreamingEventObserver<Request>
  112. ) -> ServerStreamingCallHandler<
  113. GRPCPayloadDeserializer<Request>,
  114. GRPCPayloadSerializer<Response>
  115. > {
  116. return ServerStreamingCallHandler(
  117. serializer: GRPCPayloadSerializer(),
  118. deserializer: GRPCPayloadDeserializer(),
  119. callHandlerContext: callHandlerContext,
  120. interceptors: interceptors,
  121. eventObserverFactory: eventObserverFactory
  122. )
  123. }
  124. public typealias BidirectionalStreamingContext<Response> = StreamingResponseCallContext<Response>
  125. public typealias BidirectionalStreamingEventObserver<Request> =
  126. EventLoopFuture<(StreamEvent<Request>) -> Void>
  127. @inlinable
  128. public static func makeBidirectionalStreaming<Request: Message, Response: Message>(
  129. callHandlerContext: CallHandlerContext,
  130. interceptors: [ServerInterceptor<Request, Response>] = [],
  131. eventObserverFactory: @escaping (BidirectionalStreamingContext<Response>)
  132. -> BidirectionalStreamingEventObserver<Request>
  133. ) -> BidirectionalStreamingCallHandler<
  134. ProtobufDeserializer<Request>,
  135. ProtobufSerializer<Response>
  136. > {
  137. return BidirectionalStreamingCallHandler(
  138. serializer: ProtobufSerializer(),
  139. deserializer: ProtobufDeserializer(),
  140. callHandlerContext: callHandlerContext,
  141. interceptors: interceptors,
  142. eventObserverFactory: eventObserverFactory
  143. )
  144. }
  145. @inlinable
  146. public static func makeBidirectionalStreaming<Request: GRPCPayload, Response: GRPCPayload>(
  147. callHandlerContext: CallHandlerContext,
  148. interceptors: [ServerInterceptor<Request, Response>] = [],
  149. eventObserverFactory: @escaping (BidirectionalStreamingContext<Response>)
  150. -> BidirectionalStreamingEventObserver<Request>
  151. ) -> BidirectionalStreamingCallHandler<
  152. GRPCPayloadDeserializer<Request>,
  153. GRPCPayloadSerializer<Response>
  154. > {
  155. return BidirectionalStreamingCallHandler(
  156. serializer: GRPCPayloadSerializer(),
  157. deserializer: GRPCPayloadDeserializer(),
  158. callHandlerContext: callHandlerContext,
  159. interceptors: interceptors,
  160. eventObserverFactory: eventObserverFactory
  161. )
  162. }
  163. }