From a00aee456c7d27963c8329e20c7c79697ea02565 Mon Sep 17 00:00:00 2001 From: Massimiliano Gaio Date: Sat, 1 Nov 2025 15:09:26 +0100 Subject: [PATCH 1/3] Support topic and fix parameter mapping for DataReceived event --- .../Room/Participant/LocalParticipant.cs | 39 ++++++++----------- .../Room/Participant/PublishDataOptions.cs | 13 +++++++ .../Participant/PublishDataOptions.cs.meta | 11 ++++++ Runtime/Scripts/Room/Room.cs | 15 ++++--- 4 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 Runtime/Scripts/Room/Participant/PublishDataOptions.cs create mode 100644 Runtime/Scripts/Room/Participant/PublishDataOptions.cs.meta diff --git a/Runtime/Scripts/Room/Participant/LocalParticipant.cs b/Runtime/Scripts/Room/Participant/LocalParticipant.cs index 3ea0b72..8240b70 100644 --- a/Runtime/Scripts/Room/Participant/LocalParticipant.cs +++ b/Runtime/Scripts/Room/Participant/LocalParticipant.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using UnityEngine; using UnityEngine.Scripting; namespace LiveKit @@ -161,28 +162,22 @@ public LocalTrackPublication UnpublishTrack(MediaStreamTrack track, bool? stopOn public JSPromise PublishData(byte[] data, bool reliable, string[] destinationIdentities, string topic) { return PublishData(data, 0, data.Length, reliable, destinationIdentities, topic); - } - - public JSPromise PublishData(byte[] data, int offset, int size, bool reliable, string[] destinationIdentities, string topic) - { - JSArray arr = null; - if (destinationIdentities != null) - arr = new JSArray(destinationIdentities); - - JSNative.PushData(data, offset, size); - JSNative.PushBoolean((bool)reliable); - - if (destinationIdentities == null) - JSNative.PushUndefined(); - else - JSNative.PushObject(arr.NativeHandle); - - if(topic == null) - JSNative.PushUndefined(); - else - JSNative.PushString(topic); - - return Acquire(JSNative.CallMethod(NativeHandle, "publishData")); + } + + public JSPromise PublishData(byte[] data, int offset, int size, bool reliable, string[] destinationIdentities, string topic) + { + var options = new PublishDataOptions + { + Reliable = reliable, + DestinationIdentities = destinationIdentities, + Topic = topic + }; + + JSNative.PushData(data, offset, size); + JSNative.PushStruct(JsonConvert.SerializeObject(options, JSNative.JsonSettings)); + + var result = JSNative.CallMethod(NativeHandle, "publishData"); + return Acquire(result); } public void SetTrackSubscriptionPermissions(bool allParticipantsAllowed, diff --git a/Runtime/Scripts/Room/Participant/PublishDataOptions.cs b/Runtime/Scripts/Room/Participant/PublishDataOptions.cs new file mode 100644 index 0000000..543f37b --- /dev/null +++ b/Runtime/Scripts/Room/Participant/PublishDataOptions.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; +namespace LiveKit +{ + public struct PublishDataOptions + { + [JsonProperty("reliable")] + public bool Reliable; + [JsonProperty("destinationIdentities")] + public string[] DestinationIdentities; + [JsonProperty("topic")] + public string Topic; + } +} diff --git a/Runtime/Scripts/Room/Participant/PublishDataOptions.cs.meta b/Runtime/Scripts/Room/Participant/PublishDataOptions.cs.meta new file mode 100644 index 0000000..5d6ba90 --- /dev/null +++ b/Runtime/Scripts/Room/Participant/PublishDataOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96ad49a7ff429b0419ae901b5658293c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/Room/Room.cs b/Runtime/Scripts/Room/Room.cs index a184703..498d28e 100644 --- a/Runtime/Scripts/Room/Room.cs +++ b/Runtime/Scripts/Room/Room.cs @@ -40,7 +40,7 @@ public class Room : JSEventEmitter, IDisposable public delegate void ParticipantMetadataChangedDelegate(string metadata, Participant participant); public delegate void ActiveSpeakersChangedDelegate(JSArray speakers); public delegate void RoomMetadataChangedDelegate(string metadata); - public delegate void DataReceivedDelegate(byte[] data, RemoteParticipant participant, DataPacketKind? kind); + public delegate void DataReceivedDelegate(byte[] data, RemoteParticipant participant, DataPacketKind? kind, string topic); public delegate void ConnectionQualityChangedDelegate(ConnectionQuality quality, Participant participant); public delegate void MediaDevicesErrorDelegate(JSError error); public delegate void TrackStreamStateChangedDelegate(RemoteTrackPublication publication, TrackStreamState streamState, RemoteParticipant participant); @@ -235,10 +235,15 @@ private static void EventReceived(IntPtr iptr) var kindPtr = JSNative.ShiftStack(); DataPacketKind? kind = null; if (JSNative.IsNumber(kindPtr)) - kind = (DataPacketKind?) JSNative.GetNumber(kindPtr); - - Log.Debug($"Room: Received DataReceived({data}, {participant?.Sid}, {kind})"); - room.DataReceived?.Invoke(data.ToArray(), participant, kind); + kind = (DataPacketKind?) JSNative.GetNumber(kindPtr); + + var topicPtr = JSNative.ShiftStack(); + string topic = null; + if (JSNative.IsString(topicPtr) && !JSNative.IsUndefined(topicPtr)) + topic = JSNative.GetString(topicPtr); + + Log.Debug($"Room: Received DataReceived({data}, {participant?.Sid}, {kind} {topic})"); + room.DataReceived?.Invoke(data.ToArray(), participant, kind, topic); break; } case RoomEvent.ConnectionQualityChanged: From df396d4efc66de0fe40a37be0296dc7efed2ad42 Mon Sep 17 00:00:00 2001 From: Massimiliano Gaio Date: Sat, 1 Nov 2025 15:10:26 +0100 Subject: [PATCH 2/3] removed unused using --- Runtime/Scripts/Room/Participant/LocalParticipant.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Runtime/Scripts/Room/Participant/LocalParticipant.cs b/Runtime/Scripts/Room/Participant/LocalParticipant.cs index 8240b70..e8321bf 100644 --- a/Runtime/Scripts/Room/Participant/LocalParticipant.cs +++ b/Runtime/Scripts/Room/Participant/LocalParticipant.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using UnityEngine; using UnityEngine.Scripting; namespace LiveKit From ced9ea10691437d621d7847ba8912b4f177df36c Mon Sep 17 00:00:00 2001 From: Massimiliano Gaio Date: Sat, 1 Nov 2025 15:16:01 +0100 Subject: [PATCH 3/3] improved code readability --- Runtime/Scripts/Room/Room.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Scripts/Room/Room.cs b/Runtime/Scripts/Room/Room.cs index 498d28e..00d844b 100644 --- a/Runtime/Scripts/Room/Room.cs +++ b/Runtime/Scripts/Room/Room.cs @@ -239,7 +239,7 @@ private static void EventReceived(IntPtr iptr) var topicPtr = JSNative.ShiftStack(); string topic = null; - if (JSNative.IsString(topicPtr) && !JSNative.IsUndefined(topicPtr)) + if (!JSNative.IsUndefined(topicPtr) && JSNative.IsString(topicPtr)) topic = JSNative.GetString(topicPtr); Log.Debug($"Room: Received DataReceived({data}, {participant?.Sid}, {kind} {topic})");