Swift-NIO の ChannelInboundHandler/ChannelOutboundHandler のメモ
単なるメモ

Swift-NIO の ChannelInboundHandler/ChannelOutboundHandler を記述する際のポイント
ChannelInboundHandler
- Netty の
ChannelInboundHandlerと同じく、基本的にはchannelRead(ctx:ChannelHandlerContext, data: NIOAny)を実装する NIOAny型は Netty でのObjectとに該当するが、それらの型はassociatedtypeのInboundInに型変換をおこなう- 変換は
unwrapInboundIn(_: NIOAny) -> InboundInにておこなう
- 変換は
associatedtypeで関連される型は次のものがあるInboundIn:channelReadで渡される型InboundOut: 次のChannelInboundHandlerに渡す型OutboundOut:ChannelHandlerContextに書き込む型(書き込む場合に必要)
ChannelHandlerContextに値を渡す場合は次のように行うfireChannelReadに値を渡す場合はNIOAnyを渡す. その際はwrapInboundOut(_: InboundOut) -> NIOAnyにて変換するwrite(_: NIOAny, promise: EventLoopPromise<Void>?)に値を渡す場合はNIOAnyで渡す. その際wrapOutboundOut(_: OutboundOut) -> NIOAnyにて変換する.
ChannelOutboundHandler
- Netty の
ChannelOutboundHandlerと同じくwrite(ctx: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?)を実装する data: NIOAnyはassociatedtype OutboundInにて型を指定することで型変換をおこなうunwrapOutboundIn(_: NIOAny) -> OutboundInで変換する
例
class EchoInboundHandler: ChannelInboundHandler { typealias InboundIn = ByteBuffer typealias OutboundOut = String func channelRead(ctx: ChannelHandlerContext, data: NIOAny) { var buffer = unwrapInboundIn(data) let message = buffer.readString(length: buffer.readableBytes) print("message: \(message)") ctx.write(wrapOutboundOut(message), promise: nil) } } class EchoOutboundHandler: ChannelOutboundHandler { typealias OutboundIn = String typealias OutboundOut = ByteBuffer func write(ctx: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?) { let message = unwrapOutboundIn(data) var buffer = ByteBufferAllocator().buffer(message.utf8.count) buffer.write(string: message) ctx.writeAndFlush(wrapOutboundOut(buffer), proise: nil).whenComplete({ ctx.close() }) } }
これを書き終えてから、公式のドキュメントがあることに気がついた…(´・ω・`)