Skip to content

Commit efa978f

Browse files
feat: Add bidirectional flag to video (#597)
1 parent d94eb78 commit efa978f

File tree

6 files changed

+49
-13
lines changed

6 files changed

+49
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
# [9.4.0] - 2025-08-22
6+
- Added `bidirectional` flag for websockets to support the new Bi-Directional Audio Connector
7+
58
# [9.3.1] - 2025-05-08
69
- Fixed `CustomClient` return type validation (normalise to `Void` if unknown)
710
- Deprecated Verify v1, SIM Swap and Number Verification APIs

CONTRIBUTORS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ documentation, or tests are eligible to be added to this list.
3636
- Ilya Golovin ([@ilgo0413](https://github.com/ilgo0413))
3737
- Joakim Waltersson ([@jwalter](https://github.com/jwalter))
3838
- Mofi Rahman ([@moficodes](https://github.com/moficodes))
39-
- Sina Madani ([@SMadani](https://github.com/SMadani))
39+
- Sina Madani ([@SMadani](https://github.com/SMadani))
40+
- Chris Tankersley ([#dragonmantank](https://github.com/dragonmantank))

src/main/java/com/vonage/client/video/ConnectRequest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@ public static final class Builder extends AbstractSessionTokenRequest.Builder<Co
6262
Collection<String> streams;
6363
Map<String, String> headers;
6464
Websocket.AudioRate audioRate;
65+
Boolean bidirectional;
66+
/**
67+
* (OPTIONAL)
68+
* Whether the websocket is bidirectional.
69+
*
70+
* @param bidirectional True for bidirectional, false for unidirectional.
71+
* @return This builder.
72+
*/
73+
public Builder bidirectional(Boolean bidirectional) {
74+
this.bidirectional = bidirectional;
75+
return this;
76+
}
6577

6678
private Builder() {
6779
}

src/main/java/com/vonage/client/video/Websocket.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public final class Websocket extends JsonableBaseObject {
3232
private Collection<String> streams;
3333
private Map<String, String> headers;
3434
private AudioRate audioRate;
35+
private Boolean bidirectional;
3536

3637
Websocket() {}
3738

@@ -48,6 +49,7 @@ public final class Websocket extends JsonableBaseObject {
4849
}
4950
headers = builder.headers;
5051
audioRate = builder.audioRate;
52+
bidirectional = builder.bidirectional;
5153
}
5254

5355
/**
@@ -60,6 +62,16 @@ public URI getUri() {
6062
return uri;
6163
}
6264

65+
/**
66+
* Whether the websocket is bidirectional (optional).
67+
*
68+
* @return True if bidirectional, false if not, or null if not set.
69+
*/
70+
@JsonProperty("bidirectional")
71+
public Boolean getBidirectional() {
72+
return bidirectional;
73+
}
74+
6375
/**
6476
* Stream IDs for the Vonage Video streams you want to include in the WebSocket audio.
6577
* If you omitted, all streams in the session will be included.

src/test/java/com/vonage/client/video/ConnectRequestTest.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,35 +29,39 @@ public class ConnectRequestTest {
2929

3030
@Test
3131
public void testSerializeAllParams() {
32-
var request = ConnectRequest.builder()
32+
ConnectRequest request = ConnectRequest.builder()
3333
.token(token).uri(uri).sessionId(sessionId)
3434
.streams(Collections.singleton(VideoClientTest.randomId))
3535
.audioRate(AudioRate.L16_16K)
36-
.headers(Map.of("k1", "v1")).build();
36+
.headers(Map.of("k1", "v1"))
37+
.bidirectional(true)
38+
.build();
3739

38-
var expectedJson = "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token+"\",\"websocket\":{\"uri\":\"" +
39-
uri+"\",\"streams\":[\""+randomId+"\"],\"headers\":{\"k1\":\"v1\"},\"audioRate\":16000}}";
40+
String expectedJson = "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token+"\",\"websocket\":{\"uri\":\"" +
41+
uri+"\",\"streams\":[\""+randomId+"\"],\"headers\":{\"k1\":\"v1\"},\"audioRate\":16000,\"bidirectional\":true}}";
4042

4143
assertEquals(expectedJson, request.toJson());
4244
testJsonableBaseObject(request);
45+
assertEquals(Boolean.TRUE, request.getWebsocket().getBidirectional());
4346
}
4447

4548
@Test
4649
public void testSerializeRequiredParams() {
47-
var request = ConnectRequest.builder().token(token).sessionId(sessionId).uri(uri).build();
48-
var expectedJson = "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token +
50+
ConnectRequest request = ConnectRequest.builder().token(token).sessionId(sessionId).uri(uri).build();
51+
String expectedJson = "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token +
4952
"\",\"websocket\":{\"uri\":\""+uri+"\"}}";
5053

5154
assertEquals(expectedJson, request.toJson());
55+
assertNull(request.getWebsocket().getBidirectional());
5256
}
5357

5458
@Test
5559
public void testEmptyStreamsAndHeaders() {
56-
var request = ConnectRequest.builder()
60+
ConnectRequest request = ConnectRequest.builder()
5761
.token(token).uri(uri).sessionId(sessionId)
5862
.streams().headers(Map.of()).build();
5963

60-
var expectedJson = "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token +
64+
String expectedJson = "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token +
6165
"\",\"websocket\":{\"uri\":\""+uri+"\",\"streams\":[],\"headers\":{}}}";
6266

6367
assertEquals(expectedJson, request.toJson());
@@ -66,7 +70,7 @@ public void testEmptyStreamsAndHeaders() {
6670

6771
@Test
6872
public void testUriProtocol() {
69-
var builder = ConnectRequest.builder().sessionId(sessionId).token(token);
73+
ConnectRequest.Builder builder = ConnectRequest.builder().sessionId(sessionId).token(token);
7074
assertEquals(URI.create(uri), builder.uri(uri).build().getWebsocket().getUri());
7175
assertThrows(IllegalArgumentException.class, () -> builder.uri("https://example.com/ws-endpoint").build());
7276
assertNotNull(builder.uri("ws://example.com/ws-endpoint").build().getWebsocket().getUri());

src/test/java/com/vonage/client/video/VideoClientTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1966,20 +1966,24 @@ protected ConnectRequest sampleRequest() {
19661966
.sessionId(sessionId).token(token)
19671967
.uri(wssUri).streams(streamId)
19681968
.audioRate(Websocket.AudioRate.L16_8K)
1969-
.headers(headers).build();
1969+
.headers(headers)
1970+
.bidirectional(true)
1971+
.build();
19701972
}
19711973

19721974
@Override
19731975
protected String sampleRequestBodyString() {
19741976
return "{\"sessionId\":\""+sessionId+"\",\"token\":\""+token+"\",\"websocket\":{" +
19751977
"\"uri\":\""+wssUri+"\",\"streams\":[\""+streamId+"\"]," +
1976-
"\"headers\":"+mapToJson(headers)+",\"audioRate\":8000}}";
1978+
"\"headers\":"+mapToJson(headers)+",\"audioRate\":8000,\"bidirectional\":true}}";
19771979
}
19781980

19791981
@Override
19801982
public void runTests() throws Exception {
19811983
super.runTests();
1982-
testJsonableBaseObject(sampleRequest());
1984+
ConnectRequest req = sampleRequest();
1985+
testJsonableBaseObject(req);
1986+
assertEquals(Boolean.TRUE, req.getWebsocket().getBidirectional());
19831987
}
19841988
}
19851989
.runTests();

0 commit comments

Comments
 (0)