Skip to content

Commit 3832b46

Browse files
authored
fix: add OnBufferedAmountChange callback to RTCDataChannelObserver (#206)
1 parent e518a9f commit 3832b46

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

webrtc-jni/src/main/cpp/include/api/RTCDataChannelObserver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ namespace jni
3737
// DataChannelObserver implementation.
3838
void OnStateChange() override;
3939
void OnMessage(const webrtc::DataBuffer & buffer) override;
40+
void OnBufferedAmountChange(uint64_t sent_data_size) override;
4041

4142
private:
4243
class JavaRTCDataChannelObserverClass : public JavaClass
@@ -46,6 +47,7 @@ namespace jni
4647

4748
jmethodID onStateChange;
4849
jmethodID onMessage;
50+
jmethodID onBufferedAmountChange;
4951
};
5052

5153
private:

webrtc-jni/src/main/cpp/src/api/RTCDataChannelObserver.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,21 @@ namespace jni
4848
ExceptionCheck(env);
4949
}
5050

51+
void RTCDataChannelObserver::OnBufferedAmountChange(uint64_t sent_data_size)
52+
{
53+
JNIEnv * env = AttachCurrentThread();
54+
55+
env->CallVoidMethod(observer, javaClass->onBufferedAmountChange, static_cast<jlong>(sent_data_size));
56+
57+
ExceptionCheck(env);
58+
}
59+
5160
RTCDataChannelObserver::JavaRTCDataChannelObserverClass::JavaRTCDataChannelObserverClass(JNIEnv * env)
5261
{
5362
jclass cls = FindClass(env, PKG"RTCDataChannelObserver");
5463

5564
onStateChange = GetMethod(env, cls, "onStateChange", "()V");
5665
onMessage = GetMethod(env, cls, "onMessage", "(L" PKG "RTCDataChannelBuffer;)V");
66+
onBufferedAmountChange = GetMethod(env, cls, "onBufferedAmountChange", "(J)V");
5767
}
5868
}

webrtc/src/test/java/dev/onvoid/webrtc/RTCDataChannelTests.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,65 @@
1818

1919
import static java.util.Objects.nonNull;
2020
import static org.junit.jupiter.api.Assertions.assertEquals;
21+
import static org.junit.jupiter.api.Assertions.assertTrue;
2122

2223
import java.nio.ByteBuffer;
2324
import java.nio.charset.StandardCharsets;
2425
import java.util.ArrayList;
2526
import java.util.Collections;
2627
import java.util.List;
28+
import java.util.concurrent.CountDownLatch;
2729

2830
import org.junit.jupiter.api.Assertions;
2931
import org.junit.jupiter.api.Test;
3032

3133
class RTCDataChannelTests extends TestBase {
3234

35+
@Test
36+
void bufferedAmountChangeCallback() throws Exception {
37+
DataPeerConnection caller = new DataPeerConnection(factory);
38+
DataPeerConnection callee = new DataPeerConnection(factory);
39+
40+
caller.setRemotePeerConnection(callee);
41+
callee.setRemotePeerConnection(caller);
42+
43+
callee.setRemoteDescription(caller.createOffer());
44+
caller.setRemoteDescription(callee.createAnswer());
45+
46+
caller.waitUntilConnected();
47+
callee.waitUntilConnected();
48+
49+
// Prepare a latch-based observer to detect buffered amount change.
50+
CountDownLatch latch = new CountDownLatch(1);
51+
52+
caller.getLocalDataChannel().registerObserver(new RTCDataChannelObserver() {
53+
@Override
54+
public void onBufferedAmountChange(long previousAmount) {
55+
latch.countDown();
56+
}
57+
58+
@Override
59+
public void onStateChange() { }
60+
61+
@Override
62+
public void onMessage(RTCDataChannelBuffer buffer) { }
63+
});
64+
65+
// Send a large enough message to cause buffering (increase from 0).
66+
byte[] big = new byte[64 * 1024]; // 64 KB
67+
ByteBuffer data = ByteBuffer.wrap(big);
68+
RTCDataChannelBuffer buffer = new RTCDataChannelBuffer(data, true);
69+
caller.getLocalDataChannel().send(buffer);
70+
71+
// Wait for the callback to fire to avoid flakiness.
72+
boolean signaled = latch.await(5, java.util.concurrent.TimeUnit.SECONDS);
73+
74+
assertTrue(signaled, "onBufferedAmountChange should be called when sending data");
75+
76+
caller.close();
77+
callee.close();
78+
}
79+
3380
@Test
3481
void textMessage() throws Exception {
3582
DataPeerConnection caller = new DataPeerConnection(factory);
@@ -98,6 +145,10 @@ public void onMessage(RTCDataChannelBuffer buffer) {
98145
});
99146
}
100147

148+
RTCDataChannel getLocalDataChannel() {
149+
return localDataChannel;
150+
}
151+
101152
List<String> getReceivedTexts() {
102153
return receivedTexts;
103154
}

0 commit comments

Comments
 (0)