Skip to content

Commit 32e5d19

Browse files
committed
Refactor to use specific functional interfaces for all string handlers; javadoc formatting
Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>
1 parent bc30e63 commit 32e5d19

11 files changed

Lines changed: 172 additions & 125 deletions

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/NetherNetChannel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ protected NetherNetChannel(Channel parent, InetSocketAddress remote, InetSocketA
4343
super(parent);
4444
this.remoteAddress = remote;
4545
this.localAddress = local;
46-
this.config = new DefaultNetherChannelConfig(this);
4746
}
4847

4948
public void setDataChannels(RTCDataChannel reliable, RTCDataChannel unreliable) {

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/NetherNetChildChannel.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.kastle.netty.channel.nethernet;
22

3+
import dev.kastle.netty.channel.nethernet.config.DefaultNetherChannelConfig;
34
import dev.kastle.webrtc.RTCPeerConnection;
45
import io.netty.channel.Channel;
56
import io.netty.channel.ChannelPromise;
@@ -11,6 +12,7 @@ public class NetherNetChildChannel extends NetherNetChannel {
1112
public NetherNetChildChannel(Channel parent, RTCPeerConnection peerConnection, InetSocketAddress remote, InetSocketAddress local) {
1213
super(parent, remote, local);
1314
this.peerConnection = peerConnection;
15+
this.config = new DefaultNetherChannelConfig(this);
1416
}
1517

1618
@Override

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/NetherNetClientChannel.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public NetherNetClientChannel(NetherNetClientSignaling signaling) {
6767
/**
6868
* Creates a NetherNetClientChannel.
6969
*
70-
* @param factory The PeerConnectionFactory to use. Should be reused where possible.
70+
* @param factory The PeerConnectionFactory to use. Should be reused where possible.
7171
* @param signaling The NetherNetClientSignaling instance for signaling.
7272
*/
7373
public NetherNetClientChannel(PeerConnectionFactory factory, NetherNetClientSignaling signaling) {
@@ -136,7 +136,7 @@ private void startHandshake() {
136136

137137
if (handshakeTimeoutTask != null) handshakeTimeoutTask.cancel(false);
138138

139-
signaling.setNotFoundHandler(msg -> {
139+
signaling.setNotFoundHandler(reason -> {
140140
if (connectPromise != null && !connectPromise.isDone()) {
141141
connectPromise.tryFailure(new ConnectException("Target Network ID " + this.targetNetworkId + " not found or offline."));
142142
}
@@ -325,16 +325,16 @@ private void handleSignal(String signal) {
325325
if (!isOpen() || handshakeComplete) return;
326326

327327
switch (type) {
328-
case NetherNetConstants.SIGNAL_CONNECT_RESPONSE -> {
328+
case NetherNetConstants.RTC_NEGOTIATION_CONNECT_RESPONSE -> {
329329
peerConnection.setRemoteDescription(new RTCSessionDescription(RTCSdpType.ANSWER, data), new SetSessionDescriptionObserver() {
330330
@Override public void onSuccess() {}
331331
@Override public void onFailure(String e) { /* Retry handled by timeout */ }
332332
});
333333
}
334-
case NetherNetConstants.SIGNAL_CANDIDATE_ADD -> {
334+
case NetherNetConstants.RTC_NEGOTIATION_CANDIDATE_ADD -> {
335335
peerConnection.addIceCandidate(new RTCIceCandidate("0", 0, data));
336336
}
337-
case NetherNetConstants.SIGNAL_CONNECT_ERROR -> {
337+
case NetherNetConstants.RTC_NEGOTIATION_CONNECT_ERROR -> {
338338
log.error("Received SIGNAL_CONNECT_ERROR for {}.", Long.toUnsignedString(this.connectionId));
339339
if (connectPromise != null && !connectPromise.isDone()) {
340340
connectPromise.tryFailure(new ConnectException("Remote peer sent connect error."));

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/NetherNetConstants.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,18 @@ public class NetherNetConstants {
2121
public static final int ID_DISCOVERY_RESPONSE = 0x01;
2222
public static final int ID_DISCOVERY_MESSAGE = 0x02;
2323

24-
// Signaling Message Types
25-
public static final String SIGNAL_CONNECT_REQUEST = "CONNECTREQUEST";
26-
public static final String SIGNAL_CONNECT_RESPONSE = "CONNECTRESPONSE";
27-
public static final String SIGNAL_CANDIDATE_ADD = "CANDIDATEADD";
28-
public static final String SIGNAL_CONNECT_ERROR = "CONNECTERROR";
24+
// WebRTC Negotiation Message Types
25+
public static final String RTC_NEGOTIATION_CONNECT_REQUEST = "CONNECTREQUEST";
26+
public static final String RTC_NEGOTIATION_CONNECT_RESPONSE = "CONNECTRESPONSE";
27+
public static final String RTC_NEGOTIATION_CANDIDATE_ADD = "CANDIDATEADD";
28+
public static final String RTC_NEGOTIATION_CONNECT_ERROR = "CONNECTERROR";
29+
30+
// Xbox Signaling Message Types
31+
public static final int XBOX_SIGNAL_NOT_FOUND = 0;
32+
public static final int XBOX_SIGNAL_SIGNAL = 1;
33+
public static final int XBOX_SIGNAL_CREDENTIALS = 2;
34+
public static final int XBOX_SIGNAL_ACCEPTED = 3;
35+
public static final int XBOX_SIGNAL_ACK = 4;
2936

3037
// SCTP Constants
3138
public static final int MAX_SCTP_MESSAGE_SIZE = 10000;
@@ -134,7 +141,7 @@ public static ByteBuf decryptDiscoveryPacket(ByteBuf input) throws Exception {
134141
* @return The formatted signaling message.
135142
*/
136143
public static String buildSignalConnectRequest(long connectionId, String sdp) {
137-
return SIGNAL_CONNECT_REQUEST + " " + Long.toUnsignedString(connectionId) + " " + sdp;
144+
return RTC_NEGOTIATION_CONNECT_REQUEST + " " + Long.toUnsignedString(connectionId) + " " + sdp;
138145
}
139146

140147
/**
@@ -145,7 +152,7 @@ public static String buildSignalConnectRequest(long connectionId, String sdp) {
145152
* @return The formatted signaling message.
146153
*/
147154
public static String buildSignalConnectResponse(long connectionId, String sdp) {
148-
return SIGNAL_CONNECT_RESPONSE + " " + Long.toUnsignedString(connectionId) + " " + sdp;
155+
return RTC_NEGOTIATION_CONNECT_RESPONSE + " " + Long.toUnsignedString(connectionId) + " " + sdp;
149156
}
150157

151158
/**
@@ -156,6 +163,6 @@ public static String buildSignalConnectResponse(long connectionId, String sdp) {
156163
* @return The formatted signaling message.
157164
*/
158165
public static String buildSignalCandidateAdd(long connectionId, String candidateSdp) {
159-
return SIGNAL_CANDIDATE_ADD + " " + Long.toUnsignedString(connectionId) + " " + candidateSdp;
166+
return RTC_NEGOTIATION_CANDIDATE_ADD + " " + Long.toUnsignedString(connectionId) + " " + candidateSdp;
160167
}
161168
}

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/NetherNetServerChannel.java

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import dev.kastle.netty.channel.nethernet.config.NetherChannelOption;
55
import dev.kastle.netty.channel.nethernet.signaling.NetherNetServerSignaling;
66
import dev.kastle.netty.channel.nethernet.signaling.NetherNetSignaling.IceServerInfo;
7-
import dev.kastle.netty.channel.nethernet.signaling.NetherNetXboxSignaling;
87
import dev.kastle.webrtc.CreateSessionDescriptionObserver;
98
import dev.kastle.webrtc.PeerConnectionFactory;
109
import dev.kastle.webrtc.PeerConnectionObserver;
@@ -55,7 +54,7 @@ public NetherNetServerChannel(NetherNetServerSignaling signaling) {
5554
/**
5655
* Creates a NetherNetServerChannel.
5756
*
58-
* @param factory The PeerConnectionFactory to use for creating peer connections. Should be reused where possible.
57+
* @param factory The PeerConnectionFactory to use for creating peer connections. Should be reused where possible.
5958
* @param signaling The NetherNetServerSignaling instance for signaling.
6059
*/
6160
public NetherNetServerChannel(PeerConnectionFactory factory, NetherNetServerSignaling signaling) {
@@ -81,22 +80,15 @@ public void acceptConnection(long connectionId, String offerSdp, String remoteNe
8180
rtcConfig.bundlePolicy = RTCBundlePolicy.MAX_BUNDLE;
8281

8382
// Inject ICE servers if the signaling implementation supports it
84-
if (this.signaling instanceof NetherNetXboxSignaling) {
85-
NetherNetXboxSignaling xboxSignaling = (NetherNetXboxSignaling) this.signaling;
86-
List<IceServerInfo> iceServers = xboxSignaling.getIceServers();
87-
88-
if (iceServers != null && !iceServers.isEmpty()) {
89-
log.trace("Injecting {} ICE Servers into PeerConnection for {}", iceServers.size(), Long.toUnsignedString(connectionId));
90-
for (IceServerInfo info : iceServers) {
91-
RTCIceServer iceServer = new RTCIceServer();
92-
iceServer.urls = info.urls();
93-
iceServer.username = info.username();
94-
iceServer.password = info.password();
95-
rtcConfig.iceServers.add(iceServer);
96-
log.trace(" - Added ICE Server: {} (User: {})", info.urls(), info.username());
97-
}
98-
} else {
99-
log.warn("NetherNetXboxSignaling has NO ICE servers available! WAN connections will likely fail.");
83+
List<IceServerInfo> iceServers = this.signaling.getIceServers();
84+
if (iceServers != null && !iceServers.isEmpty()) {
85+
log.trace("Injecting {} ICE Servers into PeerConnection for {}", iceServers.size(), Long.toUnsignedString(connectionId));
86+
for (IceServerInfo info : iceServers) {
87+
RTCIceServer iceServer = new RTCIceServer();
88+
iceServer.urls = info.urls();
89+
iceServer.username = info.username();
90+
iceServer.password = info.password();
91+
rtcConfig.iceServers.add(iceServer);
10092
}
10193
}
10294

@@ -124,11 +116,11 @@ public void acceptConnection(long connectionId, String offerSdp, String remoteNe
124116
String data = parts[2];
125117

126118
switch (type) {
127-
case NetherNetConstants.SIGNAL_CANDIDATE_ADD -> {
119+
case NetherNetConstants.RTC_NEGOTIATION_CANDIDATE_ADD -> {
128120
log.trace("Applying Remote Candidate for {}: {}", Long.toUnsignedString(connectionId), data);
129121
pc.addIceCandidate(new RTCIceCandidate("0", 0, data));
130122
}
131-
case NetherNetConstants.SIGNAL_CONNECT_ERROR -> {
123+
case NetherNetConstants.RTC_NEGOTIATION_CONNECT_ERROR -> {
132124
log.debug("Received CONNECT_ERROR for {}", Long.toUnsignedString(connectionId));
133125
child.close();
134126
}

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/signaling/NetherNetClientSignaling.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.net.SocketAddress;
44
import java.util.List;
55
import java.util.concurrent.CompletableFuture;
6-
import java.util.function.Consumer;
76

87
public interface NetherNetClientSignaling extends NetherNetSignaling {
98
/**
@@ -18,5 +17,18 @@ public interface NetherNetClientSignaling extends NetherNetSignaling {
1817
*
1918
* @param handler The handler to process incoming signaling messages for unknown connection IDs.
2019
*/
21-
void setNotFoundHandler(Consumer<String> handler);
20+
void setNotFoundHandler(NotFoundHandler handler);
21+
22+
/**
23+
* Functional interface for handling "Not Found" signals.
24+
*/
25+
@FunctionalInterface
26+
interface NotFoundHandler {
27+
/**
28+
* Called when the signaling service indicates the target peer was not found.
29+
*
30+
* @param reason The reason or raw message payload regarding the failure.
31+
*/
32+
void onNotFound(String reason);
33+
}
2234
}

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/signaling/NetherNetDiscovery.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.kastle.netty.channel.nethernet.NetherNetConstants;
44
import dev.kastle.netty.channel.nethernet.signaling.NetherNetServerSignaling.PongData;
5+
import dev.kastle.netty.channel.nethernet.signaling.NetherNetSignaling.SignalHandler;
56
import io.netty.bootstrap.Bootstrap;
67
import io.netty.buffer.ByteBuf;
78
import io.netty.buffer.Unpooled;
@@ -24,13 +25,12 @@
2425
import java.util.concurrent.ConcurrentHashMap;
2526
import java.util.concurrent.TimeUnit;
2627
import java.util.function.BiConsumer;
27-
import java.util.function.Consumer;
2828

2929
public class NetherNetDiscovery extends SimpleChannelInboundHandler<DatagramPacket> {
3030
private static final InternalLogger log = InternalLoggerFactory.getInstance(NetherNetDiscovery.class);
3131

3232
private final long networkId;
33-
private final Map<Long, Consumer<String>> signalHandlers = new ConcurrentHashMap<>();
33+
private final Map<Long, SignalHandler> signalHandlers = new ConcurrentHashMap<>();
3434
private final Map<Long, InetSocketAddress> peerAddresses = new ConcurrentHashMap<>();
3535
private Channel channel;
3636
private byte[] pongData;
@@ -39,7 +39,8 @@ public class NetherNetDiscovery extends SimpleChannelInboundHandler<DatagramPack
3939

4040
/**
4141
* Creates a NetherNetDiscovery instance with the specified Network ID.
42-
* * @param networkId The Network ID to use for discovery.
42+
*
43+
* @param networkId The Network ID to use for discovery.
4344
*/
4445
public NetherNetDiscovery(long networkId) {
4546
this.networkId = networkId;
@@ -120,7 +121,7 @@ public void setPongData(PongData data) {
120121
response.release();
121122
}
122123

123-
public void registerSignalHandler(long connectionId, Consumer<String> handler) {
124+
public void registerSignalHandler(long connectionId, SignalHandler handler) {
124125
this.signalHandlers.put(connectionId, handler);
125126
}
126127

@@ -275,11 +276,11 @@ private void handleMessage(ByteBuf data, long senderId) {
275276
String type = parts[0];
276277
long connectionId = Long.parseUnsignedLong(parts[1]);
277278

278-
Consumer<String> handler = signalHandlers.get(connectionId);
279+
SignalHandler handler = signalHandlers.get(connectionId);
279280

280281
if (handler != null) {
281-
handler.accept(messageData);
282-
} else if (NetherNetConstants.SIGNAL_CONNECT_REQUEST.equals(type)) {
282+
handler.onSignal(messageData);
283+
} else if (NetherNetConstants.RTC_NEGOTIATION_CONNECT_REQUEST.equals(type)) {
283284
if (newConnectionHandler != null) {
284285
String payload = parts.length > 2 ? parts[2] : "";
285286
log.trace("Dispatching New Connection: ID={} Sender={}", Long.toUnsignedString(connectionId), Long.toUnsignedString(senderId));

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/signaling/NetherNetDiscoverySignaling.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.util.concurrent.CompletableFuture;
1212
import java.util.concurrent.ThreadLocalRandom;
1313
import java.util.concurrent.atomic.AtomicReference;
14-
import java.util.function.Consumer;
1514

1615
public class NetherNetDiscoverySignaling implements NetherNetClientSignaling, NetherNetServerSignaling {
1716
private static final InternalLogger log = InternalLoggerFactory.getInstance(NetherNetDiscoverySignaling.class);
@@ -33,6 +32,7 @@ public NetherNetDiscoverySignaling() {
3332

3433
/**
3534
* Creates a NetherNetDiscoverySignaling with the specified local Network ID.
35+
*
3636
* @param localNetworkId The local Network ID to use.
3737
*/
3838
public NetherNetDiscoverySignaling(long localNetworkId) {
@@ -41,8 +41,9 @@ public NetherNetDiscoverySignaling(long localNetworkId) {
4141

4242
/**
4343
* Creates a NetherNetDiscoverySignaling with the specified local Network ID and bind address.
44+
*
4445
* @param localNetworkId The local Network ID to use.
45-
* @param bindAddress The address to bind the discovery socket to.
46+
* @param bindAddress The address to bind the discovery socket to.
4647
*/
4748
public NetherNetDiscoverySignaling(long localNetworkId, InetSocketAddress bindAddress) {
4849
this.localNetworkId = Long.toUnsignedString(localNetworkId);
@@ -149,7 +150,7 @@ public void sendSignal(String targetNetworkId, String data) {
149150
}
150151

151152
@Override
152-
public void setSignalHandler(long connectionId, Consumer<String> handler) {
153+
public void setSignalHandler(long connectionId, SignalHandler handler) {
153154
this.discovery.registerSignalHandler(connectionId, handler);
154155
}
155156

@@ -159,7 +160,7 @@ public void removeSignalHandler(long connectionId) {
159160
}
160161

161162
@Override
162-
public void setNotFoundHandler(Consumer<String> handler) {
163+
public void setNotFoundHandler(NetherNetClientSignaling.NotFoundHandler handler) {
163164
// Not implemented for Discovery signaling
164165
}
165166

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/signaling/NetherNetServerSignaling.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public interface NetherNetServerSignaling extends NetherNetSignaling {
1111

1212
/**
1313
* Handler for new connections.
14+
*
1415
* @param handler Functional interface receiving (ConnectionID, RemoteNetworkID, Payload)
1516
*/
1617
void setNewConnectionHandler(NewConnectionHandler handler);

transport-nethernet/src/main/java/dev/kastle/netty/channel/nethernet/signaling/NetherNetSignaling.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dev.kastle.netty.channel.nethernet.signaling;
22

33
import java.util.List;
4-
import java.util.function.Consumer;
54

65
public interface NetherNetSignaling extends AutoCloseable {
76

@@ -15,15 +14,15 @@ public interface NetherNetSignaling extends AutoCloseable {
1514

1615
/**
1716
* Sets a handler to receive signaling messages for a specific connection ID.
18-
*
17+
*
1918
* @param connectionId The connection ID to listen for.
2019
* @param handler The handler to process incoming signaling messages.
2120
*/
22-
void setSignalHandler(long connectionId, Consumer<String> handler);
21+
void setSignalHandler(long connectionId, SignalHandler handler);
2322

2423
/**
2524
* Removes the signaling handler for a specific connection ID.
26-
*
25+
*
2726
* @param connectionId The connection ID whose handler should be removed.
2827
*/
2928
void removeSignalHandler(long connectionId);
@@ -40,6 +39,19 @@ public interface NetherNetSignaling extends AutoCloseable {
4039
@Override
4140
void close();
4241

42+
/**
43+
* Functional interface for handling incoming signals.
44+
*/
45+
@FunctionalInterface
46+
interface SignalHandler {
47+
/**
48+
* Called when a signal is received for the registered connection ID.
49+
*
50+
* @param signal The raw signal payload.
51+
*/
52+
void onSignal(String signal);
53+
}
54+
4355
/**
4456
* Data structure for ICE server information.
4557
*

0 commit comments

Comments
 (0)