Skip to content
Merged
Show file tree
Hide file tree
Changes from 50 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
5dde98d
feat: enrich getActiveVideoStreams response and auto-resolve audio fo…
cyaiox Mar 5, 2026
aa1a5fa
fix: resolve display name from participant metadata for castV2 support
cyaiox Mar 6, 2026
d0db726
feat: auto-recover livekit player when specific track dies
cyaiox Mar 9, 2026
9724c4a
feat: play all audio tracks from livekit room in media player
cyaiox Mar 11, 2026
76f84a9
feat: auto-switch video to active speaker in CurrentStream mode
cyaiox Mar 12, 2026
23f7229
fix: prevent audio disruption on video recovery, throttle empty-audio…
cyaiox Mar 18, 2026
fbff12c
fix: make audio discovery additive to support late-joining participants
cyaiox Mar 18, 2026
a115dab
feat: expose LiveKit data messaging to scenes via CommsApi
cyaiox Mar 20, 2026
0a94799
feat: expose LiveKit data messaging and metadata to scenes via CommsApi
cyaiox Mar 25, 2026
adb19bc
feat: prioritize presentation bot video track over active speaker
cyaiox Mar 25, 2026
f208d56
docs: update cast.md with latest LiveKit features
cyaiox Mar 27, 2026
fcf5948
refactor: LivekitPlayer review feedback — Weak.Null, hasLiveAudio, fl…
cyaiox Apr 2, 2026
8198acc
refactor: CommsApi review feedback — ConcurrentDictionary, ITypedArra…
cyaiox Apr 2, 2026
8232119
refactor: CommsApi.js — add type documentation, publishData passes Ui…
cyaiox Apr 2, 2026
5a856e6
fix: clarify EnsureAudioIsPlaying comment in LivekitPlayer
cyaiox Apr 2, 2026
3de1911
feat: add gatekeeper mode dropdown to debug settings
cyaiox Apr 2, 2026
57bde90
feat: raise LiveKit video resolution cap to 2048x2048
cyaiox Apr 3, 2026
f823af7
refactor: remove UpdateMetadata from CommsApi
cyaiox Apr 3, 2026
264df49
chore: reorder constants and remove dead code per coding standards
cyaiox Apr 8, 2026
91dae53
refactor: route CommsApi through ISceneCommunicationPipe with MsgType…
cyaiox Apr 8, 2026
1cd3ad7
fix: update MessagePipe catch comment and CommsApi.js publishData to …
cyaiox Apr 8, 2026
9e89867
test: add unit tests for CommsApiWrap
cyaiox Apr 8, 2026
2ad897c
fix: rename stale test method to match MsgType.CommsData
cyaiox Apr 8, 2026
3d3e26a
chore: add missing meta file for CommsApiWrapShould test
cyaiox Apr 8, 2026
f4ba9dd
refactor: move gatekeeper URL override from app args to URL source layer
cyaiox Apr 8, 2026
020ea71
fix: align CommsApiWrap tests with wire format and JSON escaping
cyaiox Apr 9, 2026
55f421f
fix: address code review — race condition, stackalloc overflow, misle…
cyaiox Apr 16, 2026
f1d8562
refactor: use LKParticipant type alias in GetActiveVideoStreamsResponse
cyaiox Apr 16, 2026
17acc73
fix: remove stale #if guard on cross-platform media throttle fields
cyaiox Apr 16, 2026
cb7bfd9
fix: address remaining code review items — TOCTOU race, writer recove…
cyaiox Apr 16, 2026
7b6d7aa
refactor: address PR review — encapsulate video sourcing, dedup audio…
cyaiox Apr 22, 2026
1a1196b
fix: address code review — clarify MessagePipe catch and ResetWriter …
cyaiox Apr 22, 2026
125a030
refactor: address LiveKit review — AnyExposedAudioSource rename, fold…
cyaiox Apr 23, 2026
cdcc99d
clarify https://github.com/decentraland/unity-explorer/pull/7347#disc…
NickKhalow Apr 24, 2026
3609985
address https://github.com/decentraland/unity-explorer/pull/7347\#dis…
NickKhalow Apr 24, 2026
8110b64
register new category for reporting
NickKhalow Apr 24, 2026
01e12f8
address https://github.com/decentraland/unity-explorer/pull/7347\#dis…
NickKhalow Apr 24, 2026
1db196b
allocation free write, address https://github.com/decentraland/unity-…
NickKhalow Apr 24, 2026
a4cdffa
submit todo for futher optimisations
NickKhalow Apr 24, 2026
7d54777
remove redundant const
NickKhalow Apr 24, 2026
f3258fe
implement message count bouding, add explicit comments to js contract…
NickKhalow Apr 24, 2026
25317d3
implement ListPool
NickKhalow Apr 24, 2026
0fccb93
link livekit package
NickKhalow Apr 24, 2026
e6762d6
mitigate InvalidOperationException and ActiveSpeakers thread-safe access
NickKhalow Apr 24, 2026
11069e3
remove redundant locks, simplify "switch to current" method
NickKhalow Apr 24, 2026
6069f01
update package lock
NickKhalow Apr 24, 2026
c905464
unify OpenVideoStream
NickKhalow Apr 24, 2026
be13a2e
address LivekitPlayer
NickKhalow Apr 24, 2026
166270a
remove redundant code
NickKhalow Apr 24, 2026
d1ae741
Merge remote-tracking branch 'origin/dev' into feat/enhance-livekit-t…
NickKhalow Apr 24, 2026
40cb7a7
remove redundant null check
NickKhalow Apr 24, 2026
f94d250
update comment
NickKhalow Apr 24, 2026
35b424c
align livekit deps
NickKhalow Apr 24, 2026
84f60f9
Merge remote-tracking branch 'origin/dev' into feat/enhance-livekit-t…
NickKhalow Apr 27, 2026
5f53e6e
chore: Add id-token permission
cyaiox Apr 27, 2026
0ec89be
fix: remove added prop
cyaiox Apr 27, 2026
15e704a
Merge branch 'dev' into feat/enhance-livekit-track-selector
cyaiox Apr 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using DCL.Multiplayer.Connections.Messaging;
using Decentraland.Kernel.Comms.Rfc4;
using System;
using System;
using System.Threading;

namespace CrdtEcsBridge.JsModulesImplementation.Communications
Expand All @@ -11,6 +9,7 @@ public enum MsgType
{
String = 1, // SDK scenes MessageBus messages
Uint8Array = 2,
CommsData = 3, // CommsApi publish/subscribe topic-based data
Comment thread
NickKhalow marked this conversation as resolved.
}

public enum ConnectivityAssertiveness
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@

namespace Global.Dynamic.DebugSettings
{
public enum GatekeeperMode
{
Org = 0,
Zone = 1,
Today = 2,
Localhost = 3,
Custom = 4,
}

[Serializable]
public class DebugSettings
{
Expand Down Expand Up @@ -34,6 +43,13 @@ [SerializeField] [Tooltip("Make sure the ENS put here will be loaded as a Global
private bool overrideConnectionQuality;
[SerializeField]
private LKConnectionQuality connectionQuality;
[Space]
[Header("Comms Gatekeeper")]
[SerializeField]
private GatekeeperMode gatekeeperMode;
[SerializeField] [Tooltip("Base gatekeeper URL used only when Gatekeeper Mode is set to Custom (e.g. http://localhost:3000)")]
private string customGatekeeperUrl = string.Empty;
[Space]
[SerializeField]
private string[] appParameters;

Expand All @@ -52,6 +68,8 @@ public static DebugSettings Release() =>
connectionQuality = LKConnectionQuality.QualityExcellent,
enableRemotePortableExperiences = true,
emotesToAddToUserProfile = null,
gatekeeperMode = GatekeeperMode.Org,
customGatekeeperUrl = string.Empty,
appParameters = Array.Empty<string>(),
};

Expand All @@ -68,6 +86,8 @@ public static DebugSettings Release() =>
public bool EnableEmulateNoLivekitConnection => Application.isEditor? this.enableEmulateNoLivekitConnection : RELEASE_SETTINGS.enableEmulateNoLivekitConnection;
public bool OverrideConnectionQuality => Application.isEditor ? this.overrideConnectionQuality : RELEASE_SETTINGS.overrideConnectionQuality;
public LKConnectionQuality ConnectionQuality => Application.isEditor ? this.connectionQuality : RELEASE_SETTINGS.connectionQuality;
public string[] AppParameters => appParameters;
public GatekeeperMode GatekeeperMode => Application.isEditor ? gatekeeperMode : RELEASE_SETTINGS.gatekeeperMode;
public string CustomGatekeeperUrl => Application.isEditor ? customGatekeeperUrl : RELEASE_SETTINGS.customGatekeeperUrl;
public string[] AppParameters => Application.isEditor ? appParameters : RELEASE_SETTINGS.appParameters;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
using ECS.StreamableLoading.Common.Components;
using Newtonsoft.Json.Linq;
using Global.AppArgs;
using Global.Dynamic.DebugSettings;
using Global.Dynamic.RealmUrl;
using Global.Dynamic.RealmUrl.Names;
using Global.Versioning;
Expand Down Expand Up @@ -187,7 +188,9 @@ private async UniTask InitializeFlowAsync(CancellationToken ct)
World world = World.Create();

var realmData = new RealmData();
var decentralandUrlsSource = new GatewayUrlsSource(decentralandEnvironment, realmData, launchSettings);
string? gatekeeperBaseOverride = ResolveGatekeeperBaseOverride(debugSettings.GatekeeperMode, debugSettings.CustomGatekeeperUrl);
ReportHub.Log(ReportCategory.STARTUP, $"Gatekeeper mode: {debugSettings.GatekeeperMode}, base override: {gatekeeperBaseOverride ?? "(default)"}");
var decentralandUrlsSource = new GatewayUrlsSource(decentralandEnvironment, realmData, launchSettings, gatekeeperBaseOverride);
DiagnosticInfoUtils.LogEnvironment(decentralandUrlsSource);

var assetsProvisioner = new AddressablesProvisioner();
Expand Down Expand Up @@ -802,6 +805,17 @@ public void Dispose()
}
}

private static string? ResolveGatekeeperBaseOverride(GatekeeperMode mode, string customUrl) =>
Comment thread
cyaiox marked this conversation as resolved.
mode switch
{
GatekeeperMode.Org => null,
GatekeeperMode.Zone => "https://comms-gatekeeper.decentraland.zone",
GatekeeperMode.Today => "https://comms-gatekeeper.decentraland.today",
GatekeeperMode.Localhost => "http://localhost:3000",
GatekeeperMode.Custom => string.IsNullOrEmpty(customUrl) ? null : customUrl,
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
};

[Serializable]
public class SplashScreenRef : ComponentReference<SplashScreen>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;

namespace Global.Editor
{
Expand Down Expand Up @@ -157,11 +158,15 @@ private static Rect DrawDefaultProperties(Rect position, SerializedProperty prop
SerializedProperty endProperty = property.GetEndProperty();

bool enterChildren = true;
bool isCustomGatekeeper = IsCustomGatekeeperMode(property);

while (iterator.NextVisible(enterChildren) && !SerializedProperty.EqualContents(iterator, endProperty))
{
enterChildren = false;

if (iterator.name == "customGatekeeperUrl" && !isCustomGatekeeper)
continue;

float propertyHeight = EditorGUI.GetPropertyHeight(iterator, true);
position.height = propertyHeight;
EditorGUI.PropertyField(position, iterator, true);
Expand All @@ -178,16 +183,28 @@ private static float GetDefaultPropertiesHeight(SerializedProperty property)
SerializedProperty endProperty = property.GetEndProperty();

bool enterChildren = true;
bool isCustomGatekeeper = IsCustomGatekeeperMode(property);

while (iterator.NextVisible(enterChildren) && !SerializedProperty.EqualContents(iterator, endProperty))
{
enterChildren = false;

if (iterator.name == "customGatekeeperUrl" && !isCustomGatekeeper)
continue;

height += EditorGUI.GetPropertyHeight(iterator, true) + EditorGUIUtility.standardVerticalSpacing;
}

return height;
}

private static bool IsCustomGatekeeperMode(SerializedProperty property)
{
SerializedProperty gatekeeperMode = property.FindPropertyRelative("gatekeeperMode");
Comment thread
NickKhalow marked this conversation as resolved.
Assert.IsNotNull(gatekeeperMode, "Failed to find 'gatekeeperMode' property.");
return gatekeeperMode.intValue == (int)GatekeeperMode.Custom;
}

private static string? FindCreatorHubPath()
{
// Check default path
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,8 @@ private async UniTask<ISceneFacade> CreateSceneAsync(ISceneData sceneData, IJsAp
sceneData,
realmData,
portableExperiencesController,
remoteMetadata
remoteMetadata,
messagePipesHub
);
}
else
Expand Down Expand Up @@ -253,7 +254,8 @@ private async UniTask<ISceneFacade> CreateSceneAsync(ISceneData sceneData, IJsAp
sceneData,
realmData,
portableExperiencesController,
remoteMetadata
remoteMetadata,
messagePipesHub
);
}

Expand Down
Loading
Loading