Skip to content

Commit 058e616

Browse files
committed
Implement getLocalAddressGen on JVM
1 parent 906d8d5 commit 058e616

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package fs2
2+
package io
3+
package net
4+
5+
import com.comcast.ip4s.{GenSocketAddress, SocketAddress, UnixSocketAddress}
6+
import java.net.{InetSocketAddress, UnixDomainSocketAddress}
7+
import jnr.unixsocket.{UnixSocketAddress => JnrUnixSocketAddress}
8+
9+
private[net] object SocketAddressHelpers {
10+
11+
def toGenSocketAddress(address: java.net.SocketAddress): GenSocketAddress = {
12+
address match {
13+
case addr: InetSocketAddress => SocketAddress.fromInetSocketAddress(addr)
14+
case _ =>
15+
if (JdkUnixSocketsProvider.supported && address.isInstanceOf[UnixDomainSocketAddress]) {
16+
UnixSocketAddress(address.asInstanceOf[UnixDomainSocketAddress].getPath.toString)
17+
} else if (JnrUnixSocketsProvider.supported && address.isInstanceOf[JnrUnixSocketAddress]) {
18+
UnixSocketAddress(address.asInstanceOf[JnrUnixSocketAddress].path)
19+
} else throw new IllegalArgumentException("Unsupported address type: " + address)
20+
}
21+
}
22+
}

io/jvm-native/src/main/scala/fs2/io/net/SocketInfoPlatform.scala

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ package fs2
2323
package io
2424
package net
2525

26-
import com.comcast.ip4s.{GenSocketAddress, SocketAddress}
26+
import com.comcast.ip4s.GenSocketAddress
2727
import cats.effect.Async
2828

29-
import java.net.InetSocketAddress
3029
import java.nio.channels.NetworkChannel
3130

3231
import scala.jdk.CollectionConverters.*
@@ -44,12 +43,7 @@ private[net] trait SocketInfoCompanionPlatform {
4443
protected def channel: NetworkChannel
4544

4645
override def localAddressGen: F[GenSocketAddress] =
47-
asyncInstance.delay(
48-
channel.getLocalAddress match {
49-
case addr: InetSocketAddress => SocketAddress.fromInetSocketAddress(addr)
50-
// TODO handle unix sockets
51-
}
52-
)
46+
asyncInstance.delay(SocketAddressHelpers.toGenSocketAddress(channel.getLocalAddress))
5347

5448
override def supportedOptions: F[Set[SocketOption.Key[?]]] =
5549
asyncInstance.delay {

io/jvm-native/src/main/scala/fs2/io/net/SocketPlatform.scala

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ private[net] trait SocketCompanionPlatform {
124124
F.delay(Some(endOfInput.voidError))
125125
}
126126

127-
def write(bytes: Chunk[Byte]): F[Unit] = {
127+
override def write(bytes: Chunk[Byte]): F[Unit] = {
128128
def go(buff: ByteBuffer): F[Unit] =
129129
F.async[Int] { cb =>
130130
ch.write(
@@ -150,23 +150,24 @@ private[net] trait SocketCompanionPlatform {
150150
)
151151
)
152152

153-
def remoteAddress: F[SocketAddress[IpAddress]] =
153+
override def remoteAddress: F[SocketAddress[IpAddress]] =
154154
F.delay(
155155
SocketAddress.fromInetSocketAddress(
156156
ch.getRemoteAddress.asInstanceOf[InetSocketAddress]
157157
)
158158
)
159159

160-
override def remoteAddressGen: F[GenSocketAddress] = ???
160+
override def remoteAddressGen: F[GenSocketAddress] =
161+
F.delay(SocketAddressHelpers.toGenSocketAddress(ch.getRemoteAddress))
161162

162-
def isOpen: F[Boolean] = F.delay(ch.isOpen)
163+
override def isOpen: F[Boolean] = F.delay(ch.isOpen)
163164

164-
def endOfOutput: F[Unit] =
165+
override def endOfOutput: F[Unit] =
165166
F.delay {
166167
ch.shutdownOutput(); ()
167168
}
168169

169-
def endOfInput: F[Unit] =
170+
override def endOfInput: F[Unit] =
170171
F.delay {
171172
ch.shutdownInput(); ()
172173
}

0 commit comments

Comments
 (0)