diff --git a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleConfig.kt b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleConfig.kt index fea0570..528e351 100644 --- a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleConfig.kt +++ b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleConfig.kt @@ -9,5 +9,6 @@ data class TailscaleConfig( val controlUrl: String? = null, val authKey: String? = null, val tailscalePath: String? = null, - val ephemeral: Boolean = false + val ephemeral: Boolean = false, + val useProcSelfFd: Boolean = false ) diff --git a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleController.kt b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleController.kt index be1bae0..95d9d3e 100644 --- a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleController.kt +++ b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleController.kt @@ -12,6 +12,7 @@ class TailscaleController(val server: Server, val config: TailscaleConfig) { if (!config.enabled) { return } + tailscale.useProcSelfFd = config.useProcSelfFd tailscale.hostname = config.hostname if (config.controlUrl != null) { diff --git a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleProxyServer.kt b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleProxyServer.kt index 74fc08d..f9d9e06 100644 --- a/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleProxyServer.kt +++ b/foundation-tailscale/src/main/kotlin/gay/pizza/foundation/tailscale/TailscaleProxyServer.kt @@ -1,16 +1,13 @@ package gay.pizza.foundation.tailscale +import gay.pizza.tailscale.channel.ChannelCopier import gay.pizza.tailscale.core.Tailscale import gay.pizza.tailscale.core.TailscaleConn import gay.pizza.tailscale.core.TailscaleListener import org.bukkit.Server import java.net.InetSocketAddress import java.net.StandardSocketOptions -import java.nio.ByteBuffer -import java.nio.channels.ClosedChannelException -import java.nio.channels.ReadableByteChannel import java.nio.channels.SocketChannel -import java.nio.channels.WritableByteChannel class TailscaleProxyServer(val server: Server, val tailscale: Tailscale) { private var minecraftServerListener: TailscaleListener? = null @@ -34,38 +31,13 @@ class TailscaleProxyServer(val server: Server, val tailscale: Tailscale) { val readChannel = conn.openReadChannel() val writeChannel = conn.openWriteChannel() - fun closeAll() { - socketChannel.close() - readChannel.close() - writeChannel.close() - } - - fun startCopyThread(name: String, from: ReadableByteChannel, to: WritableByteChannel) { - val thread = Thread { - try { - while (true) { - val buffer = ByteBuffer.allocate(2048) - val size = from.read(buffer) - if (size < 0) { - break - } else { - buffer.flip() - to.write(buffer) - } - buffer.clear() - } - } catch (_: ClosedChannelException) { - } finally { - closeAll() - } - } - - thread.name = name - thread.start() - } - - startCopyThread("Tailscale to Socket Pipe", readChannel, socketChannel) - startCopyThread("Socket to Tailscale Pipe", socketChannel, writeChannel) + val closeHandler = { socketChannel.close() } + val tailscaleSocketCopier = ChannelCopier(readChannel, socketChannel) + tailscaleSocketCopier.spawnCopyThread( + "Tailscale to Socket Copier", onClose = closeHandler) + val socketTailscaleCopier = ChannelCopier(socketChannel, writeChannel) + socketTailscaleCopier.spawnCopyThread( + "Socket to Tailscale Copier", onClose = closeHandler) } fun close() { diff --git a/settings.gradle.kts b/settings.gradle.kts index 3caa643..da565b6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -73,7 +73,7 @@ dependencyResolutionManagement { version("postgresql", "42.5.3") version("exposed", "0.41.1") version("hikaricp", "5.0.1") - version("libtailscale", "0.1.4-SNAPSHOT") + version("libtailscale", "0.1.5-SNAPSHOT") library("clikt", "com.github.ajalt.clikt", "clikt").versionRef("clikt") library("xodus-core", "org.jetbrains.xodus", "xodus-openAPI").versionRef("xodus")