Skip to content

Commit d01c3ef

Browse files
authored
Fix NPE when streaming text (#670)
* Fix NPE in when streaming text * spotless and changeset
1 parent 5003786 commit d01c3ef

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

.changeset/cyan-spoons-try.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"client-sdk-android": patch
3+
---
4+
5+
Fix NPE when streaming text

livekit-android-sdk/src/main/java/io/livekit/android/room/datastream/outgoing/OutgoingDataStreamManager.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ constructor(
9898
textHeader = with(DataStream.TextHeader.newBuilder()) {
9999
this.operationType = info.operationType.toProto()
100100
this.version = info.version
101-
this.replyToStreamId = info.replyToStreamId
101+
if (info.replyToStreamId != null) {
102+
this.replyToStreamId = info.replyToStreamId
103+
}
102104
this.addAllAttachedStreamIds(info.attachedStreamIds)
103105
this.generated = info.generated
104106
build()

livekit-android-test/src/test/java/io/livekit/android/room/datastream/RoomOutgoingDataStreamMockE2ETest.kt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,60 @@ class RoomOutgoingDataStreamMockE2ETest : MockE2ETest() {
9999
assertTrue(reason.isNullOrEmpty())
100100
}
101101
}
102+
103+
@Test
104+
fun textStream() = runTest {
105+
connect()
106+
107+
// Remote participant to send data to
108+
wsFactory.listener.onMessage(
109+
wsFactory.ws,
110+
TestData.PARTICIPANT_JOIN.toOkioByteString(),
111+
)
112+
113+
val text = "test_text"
114+
val job = launch {
115+
val sender = room.localParticipant.streamText(
116+
StreamTextOptions(
117+
topic = "topic",
118+
attributes = mapOf("hello" to "world"),
119+
streamId = "stream_id",
120+
destinationIdentities = listOf(Participant.Identity(TestData.REMOTE_PARTICIPANT.identity)),
121+
operationType = TextStreamInfo.OperationType.CREATE,
122+
version = 0,
123+
attachedStreamIds = emptyList(),
124+
replyToStreamId = null,
125+
totalSize = 3,
126+
),
127+
)
128+
sender.write(text)
129+
sender.close()
130+
}
131+
132+
job.join()
133+
134+
val buffers = pubDataChannel.sentBuffers
135+
136+
println(buffers)
137+
assertEquals(3, buffers.size)
138+
139+
val headerPacket = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffers[0].data))
140+
assertTrue(headerPacket.hasStreamHeader())
141+
142+
with(headerPacket.streamHeader) {
143+
assertTrue(hasTextHeader())
144+
}
145+
146+
val payloadPacket = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffers[1].data))
147+
assertTrue(payloadPacket.hasStreamChunk())
148+
with(payloadPacket.streamChunk) {
149+
assertEquals(text, content.toStringUtf8())
150+
}
151+
152+
val trailerPacket = LivekitModels.DataPacket.parseFrom(ByteString.copyFrom(buffers[2].data))
153+
assertTrue(trailerPacket.hasStreamTrailer())
154+
with(trailerPacket.streamTrailer) {
155+
assertTrue(reason.isNullOrEmpty())
156+
}
157+
}
102158
}

0 commit comments

Comments
 (0)