BaseCallHandler.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import Foundation
  2. import SwiftProtobuf
  3. import NIO
  4. import NIOHTTP1
  5. /// Provides a means for decoding incoming gRPC messages into protobuf objects.
  6. ///
  7. /// Calls through to `processMessage` for individual messages it receives, which needs to be implemented by subclasses.
  8. public class BaseCallHandler<RequestMessage: Message, ResponseMessage: Message>: GRPCCallHandler {
  9. public func makeGRPCServerCodec() -> ChannelHandler { return GRPCServerCodec<RequestMessage, ResponseMessage>() }
  10. /// Called whenever a message has been received.
  11. ///
  12. /// Overridden by subclasses.
  13. public func processMessage(_ message: RequestMessage) {
  14. fatalError("needs to be overridden")
  15. }
  16. /// Called when the client has half-closed the stream, indicating that they won't send any further data.
  17. ///
  18. /// Overridden by subclasses if the "end-of-stream" event is relevant.
  19. public func endOfStreamReceived() { }
  20. }
  21. extension BaseCallHandler: ChannelInboundHandler {
  22. public typealias InboundIn = GRPCServerRequestPart<RequestMessage>
  23. public typealias OutboundOut = GRPCServerResponsePart<ResponseMessage>
  24. public func channelRead(ctx: ChannelHandlerContext, data: NIOAny) {
  25. switch self.unwrapInboundIn(data) {
  26. case .head: preconditionFailure("should not have received headers")
  27. case .message(let message): processMessage(message)
  28. case .end: endOfStreamReceived()
  29. }
  30. }
  31. }