Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/net/src/main/kotlin/org/openrs2/net/BootstrapFactory.kt

76 lines
3.0 KiB

package org.openrs2.net
import io.netty.bootstrap.Bootstrap
import io.netty.bootstrap.ServerBootstrap
import io.netty.buffer.ByteBufAllocator
import io.netty.channel.ChannelOption
import io.netty.channel.EventLoopGroup
import io.netty.channel.epoll.Epoll
import io.netty.channel.epoll.EpollEventLoopGroup
import io.netty.channel.epoll.EpollServerSocketChannel
import io.netty.channel.epoll.EpollSocketChannel
import io.netty.channel.kqueue.KQueue
import io.netty.channel.kqueue.KQueueEventLoopGroup
import io.netty.channel.kqueue.KQueueServerSocketChannel
import io.netty.channel.kqueue.KQueueSocketChannel
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.nio.NioServerSocketChannel
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.incubator.channel.uring.IOUringEventLoopGroup
import io.netty.incubator.channel.uring.IOUringServerSocketChannel
import io.netty.incubator.channel.uring.IOUringSocketChannel
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
public class BootstrapFactory @Inject constructor(
private val alloc: ByteBufAllocator
) {
public fun createEventLoopGroup(): EventLoopGroup {
return when {
/*
* XXX(gpe): disable io_uring for now, it's incompatible with
* FileRegion.
*/
// IOUring.isAvailable() -> IOUringEventLoopGroup()
Epoll.isAvailable() -> EpollEventLoopGroup()
KQueue.isAvailable() -> KQueueEventLoopGroup()
else -> NioEventLoopGroup()
}
}
public fun createBootstrap(group: EventLoopGroup): Bootstrap {
val channel = when (group) {
is IOUringEventLoopGroup -> IOUringSocketChannel::class.java
is EpollEventLoopGroup -> EpollSocketChannel::class.java
is KQueueEventLoopGroup -> KQueueSocketChannel::class.java
is NioEventLoopGroup -> NioSocketChannel::class.java
else -> throw IllegalArgumentException("Unknown EventLoopGroup type")
}
return Bootstrap()
.group(group)
.channel(channel)
.option(ChannelOption.ALLOCATOR, alloc)
.option(ChannelOption.AUTO_READ, false)
.option(ChannelOption.TCP_NODELAY, true)
}
public fun createServerBootstrap(group: EventLoopGroup): ServerBootstrap {
val channel = when (group) {
is IOUringEventLoopGroup -> IOUringServerSocketChannel::class.java
is EpollEventLoopGroup -> EpollServerSocketChannel::class.java
is KQueueEventLoopGroup -> KQueueServerSocketChannel::class.java
is NioEventLoopGroup -> NioServerSocketChannel::class.java
else -> throw IllegalArgumentException("Unknown EventLoopGroup type")
}
return ServerBootstrap()
.group(group)
.channel(channel)
.option(ChannelOption.ALLOCATOR, alloc)
.childOption(ChannelOption.ALLOCATOR, alloc)
.childOption(ChannelOption.AUTO_READ, false)
.childOption(ChannelOption.TCP_NODELAY, true)
}
}