Skip to content

Commit e4f133c

Browse files
authored
Add PingEvent, PongEvent, TranscriptionResultEvent to MediaJson. (#225)
* feat: Add PingEvent and PongEvent. * Add TranscriptionResultEvent.
1 parent 9e95588 commit e4f133c

File tree

2 files changed

+153
-6
lines changed

2 files changed

+153
-6
lines changed

jicoco-mediajson/src/main/kotlin/org/jitsi/mediajson/MediaJson.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.jitsi.mediajson
1717

18+
import com.fasterxml.jackson.annotation.JsonAnyGetter
19+
import com.fasterxml.jackson.annotation.JsonAnySetter
1820
import com.fasterxml.jackson.annotation.JsonSubTypes
1921
import com.fasterxml.jackson.annotation.JsonTypeInfo
2022
import com.fasterxml.jackson.core.JsonGenerator
@@ -39,7 +41,10 @@ private val objectMapper = jacksonObjectMapper().apply {
3941
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "event")
4042
@JsonSubTypes(
4143
JsonSubTypes.Type(value = MediaEvent::class, name = "media"),
44+
JsonSubTypes.Type(value = PingEvent::class, name = "ping"),
45+
JsonSubTypes.Type(value = PongEvent::class, name = "pong"),
4246
JsonSubTypes.Type(value = StartEvent::class, name = "start"),
47+
JsonSubTypes.Type(value = TranscriptionResultEvent::class, name = "transcription-result"),
4348
)
4449
sealed class Event(val event: String) {
4550
fun toJson(): String = objectMapper.writeValueAsString(this)
@@ -63,6 +68,27 @@ data class StartEvent(
6368
val start: Start
6469
) : Event("start")
6570

71+
data class PingEvent(
72+
val id: Int
73+
) : Event("ping")
74+
75+
data class PongEvent(
76+
val id: Int
77+
) : Event("pong")
78+
79+
@com.fasterxml.jackson.annotation.JsonIgnoreProperties(value = ["event"], allowGetters = false)
80+
class TranscriptionResultEvent : Event("transcription-result") {
81+
private val additionalProperties = mutableMapOf<String, Any?>()
82+
83+
@JsonAnySetter
84+
fun setAdditionalProperty(name: String, value: Any?) {
85+
additionalProperties[name] = value
86+
}
87+
88+
@JsonAnyGetter
89+
fun getAdditionalProperties(): Map<String, Any?> = additionalProperties
90+
}
91+
6692
data class MediaFormat(
6793
val encoding: String,
6894
val sampleRate: Int,

jicoco-mediajson/src/test/kotlin/org/jitsi/mediajson/MediaJsonTest.kt

Lines changed: 127 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,52 @@ class MediaJsonTest : ShouldSpec() {
9292
(parsed === event) shouldBe false
9393
}
9494
}
95+
context("PingEvent") {
96+
val id = 42
97+
val event = PingEvent(id)
98+
99+
context("Serializing") {
100+
val parsed = parser.parse(event.toJson())
101+
parsed.shouldBeInstanceOf<JSONObject>()
102+
parsed["event"] shouldBe "ping"
103+
parsed["id"] shouldBe id
104+
}
105+
context("Parsing") {
106+
val parsed = Event.parse(event.toJson())
107+
(parsed == event) shouldBe true
108+
(parsed === event) shouldBe false
109+
}
110+
}
111+
context("PongEvent") {
112+
val id = 123
113+
val event = PongEvent(id)
114+
115+
context("Serializing") {
116+
val parsed = parser.parse(event.toJson())
117+
parsed.shouldBeInstanceOf<JSONObject>()
118+
parsed["event"] shouldBe "pong"
119+
parsed["id"] shouldBe id
120+
}
121+
context("Parsing") {
122+
val parsed = Event.parse(event.toJson())
123+
(parsed == event) shouldBe true
124+
(parsed === event) shouldBe false
125+
}
126+
}
127+
context("TranscriptionResultEvent") {
128+
val event = TranscriptionResultEvent()
129+
130+
context("Serializing") {
131+
val parsed = parser.parse(event.toJson())
132+
parsed.shouldBeInstanceOf<JSONObject>()
133+
parsed["event"] shouldBe "transcription-result"
134+
}
135+
context("Parsing") {
136+
val parsed = Event.parse(event.toJson())
137+
parsed.shouldBeInstanceOf<TranscriptionResultEvent>()
138+
parsed.event shouldBe "transcription-result"
139+
}
140+
}
95141
context("Parsing valid samples") {
96142
context("Start") {
97143
val parsed = Event.parse(
@@ -179,15 +225,15 @@ class MediaJsonTest : ShouldSpec() {
179225
context("Media with seq/chunk/timestamp as numbers") {
180226
val parsed = Event.parse(
181227
"""
182-
{
228+
{
183229
"event": "media",
184-
"sequenceNumber": 2,
185-
"media": {
186-
"tag": "incoming",
187-
"chunk": 1,
230+
"sequenceNumber": 2,
231+
"media": {
232+
"tag": "incoming",
233+
"chunk": 1,
188234
"timestamp": 5,
189235
"payload": "no+JhoaJjpzSHxAKBgYJ...=="
190-
}
236+
}
191237
}
192238
""".trimIndent()
193239
)
@@ -200,6 +246,81 @@ class MediaJsonTest : ShouldSpec() {
200246
parsed.media.timestamp shouldBe 5
201247
parsed.media.payload shouldBe "no+JhoaJjpzSHxAKBgYJ...=="
202248
}
249+
context("Ping") {
250+
val parsed = Event.parse(
251+
"""
252+
{
253+
"event": "ping",
254+
"id": 42
255+
}
256+
""".trimIndent()
257+
)
258+
259+
parsed.shouldBeInstanceOf<PingEvent>()
260+
parsed.event shouldBe "ping"
261+
parsed.id shouldBe 42
262+
}
263+
context("Pong") {
264+
val parsed = Event.parse(
265+
"""
266+
{
267+
"event": "pong",
268+
"id": 123
269+
}
270+
""".trimIndent()
271+
)
272+
273+
parsed.shouldBeInstanceOf<PongEvent>()
274+
parsed.event shouldBe "pong"
275+
parsed.id shouldBe 123
276+
}
277+
context("TranscriptionResult ") {
278+
val originalJson = """
279+
{
280+
"transcript": [
281+
{
282+
"confidence": 0.999666973709317,
283+
"text": "blah blah blah"
284+
}
285+
],
286+
"is_interim": false,
287+
"message_id": "item_CnopdEudFcwXCkZfCIHrC",
288+
"type": "transcription-result",
289+
"event": "transcription-result",
290+
"participant": {
291+
"id": "08847b00",
292+
"ssrc": "1776301157"
293+
},
294+
"timestamp": 1765989508172
295+
}
296+
""".trimIndent()
297+
298+
val parsed = Event.parse(originalJson)
299+
parsed.shouldBeInstanceOf<TranscriptionResultEvent>()
300+
301+
val serialized = parsed.toJson()
302+
val reparsed = parser.parse(serialized)
303+
reparsed.shouldBeInstanceOf<JSONObject>()
304+
305+
reparsed["event"] shouldBe "transcription-result"
306+
reparsed["type"] shouldBe "transcription-result"
307+
reparsed["message_id"] shouldBe "item_CnopdEudFcwXCkZfCIHrC"
308+
reparsed["is_interim"] shouldBe false
309+
reparsed["timestamp"] shouldBe 1765989508172L
310+
311+
val transcript = reparsed["transcript"]
312+
transcript.shouldBeInstanceOf<List<*>>()
313+
transcript.size shouldBe 1
314+
val transcriptItem = transcript[0] as Map<*, *>
315+
transcriptItem.shouldBeInstanceOf<Map<*, *>>()
316+
transcriptItem["confidence"] shouldBe 0.999666973709317
317+
transcriptItem["text"] shouldBe "blah blah blah"
318+
319+
val participant = reparsed["participant"]
320+
participant.shouldBeInstanceOf<Map<*, *>>()
321+
participant["id"] shouldBe "08847b00"
322+
participant["ssrc"] shouldBe "1776301157"
323+
}
203324
}
204325
context("Parsing invalid samples") {
205326
context("Invalid sequence number") {

0 commit comments

Comments
 (0)