diff --git a/Editor/TokenSourceConfigEditor.cs b/Editor/TokenSourceComponentConfigEditor.cs similarity index 96% rename from Editor/TokenSourceConfigEditor.cs rename to Editor/TokenSourceComponentConfigEditor.cs index d39f19ca..ad398a2a 100644 --- a/Editor/TokenSourceConfigEditor.cs +++ b/Editor/TokenSourceComponentConfigEditor.cs @@ -2,8 +2,8 @@ using UnityEngine; using LiveKit; -[CustomEditor(typeof(TokenSourceConfig))] -public class TokenSourceConfigEditor : Editor +[CustomEditor(typeof(TokenSourceComponentConfig))] +public class TokenSourceComponentConfigEditor : Editor { public override void OnInspectorGUI() { diff --git a/Editor/TokenSourceConfigEditor.cs.meta b/Editor/TokenSourceComponentConfigEditor.cs.meta similarity index 100% rename from Editor/TokenSourceConfigEditor.cs.meta rename to Editor/TokenSourceComponentConfigEditor.cs.meta diff --git a/README.md b/README.md index 388177ca..b72f1dde 100644 --- a/README.md +++ b/README.md @@ -223,7 +223,7 @@ Use the samples of the package to see how to use the SDK. You need a token to join a LiveKit room as a participant. Read more about tokens here: https://docs.livekit.io/frontends/reference/tokens-grants/ -To help getting started with tokens, use `TokenSource.cs` with a `TokenSourceConfig` ScriptableObject (see https://docs.livekit.io/frontends/build/authentication/#tokensource). Create a config asset via **Right Click > Create > LiveKit > Token Source Config** and select one of three token source types: +To help getting started with tokens, use `TokenSourceComponent.cs` with a `TokenSourceComponentConfig` ScriptableObject (see https://docs.livekit.io/frontends/build/authentication/#tokensource). Create a config asset via **Right Click > Create > LiveKit > TokenSourceComponentConfig** and select one of three token source types: #### 1. Literal Use this to pass a pregenerated server URL and token. Generate tokens via the [LiveKit CLI](https://docs.livekit.io/frontends/build/authentication/custom/#manual-token-creation) or from your [LiveKit Cloud](https://cloud.livekit.io/) project's API key page. @@ -236,10 +236,10 @@ For production. Point to your own token endpoint URL and add any required authen #### Usage -Add a `TokenSource` component to a GameObject, assign your `TokenSourceConfig` asset, then fetch connection details before connecting: +Add a `TokenSourceComponent` to a GameObject, assign your `TokenSourceComponentConfig` asset, then fetch connection details before connecting: ```cs -var connectionDetailsTask = _tokenSource.FetchConnectionDetails(); +var connectionDetailsTask = _tokenSourceComponent.FetchConnectionDetails(); yield return new WaitUntil(() => connectionDetailsTask.IsCompleted); if (connectionDetailsTask.IsFaulted) @@ -253,6 +253,25 @@ _room = new Room(); var connect = _room.Connect(details.ServerUrl, details.ParticipantToken, new RoomOptions()); ``` +Per-call overrides (e.g. dynamic room or participant names) can be passed via `TokenSourceFetchOptions`; any field set there wins over the asset, and unset fields fall back to the config: + +```cs +var task = _tokenSourceComponent.FetchConnectionDetails(new TokenSourceFetchOptions +{ + RoomName = "lobby-" + System.Guid.NewGuid(), + ParticipantName = playerName, +}); +``` + +To skip the ScriptableObject entirely, instantiate a token source directly: + +```cs +ITokenSourceFixed source = new TokenSourceLiteral("wss://your.livekit.host", ""); +// or: new TokenSourceSandbox(""); +// or: new TokenSourceEndpoint("https://your.token-server/api/token", headers); +// or: new TokenSourceCustom(async () => await MyAuthFlow()); +``` + diff --git a/Runtime/Scripts/Internal/IsExternalInit.cs b/Runtime/Scripts/Internal/IsExternalInit.cs new file mode 100644 index 00000000..5ead4123 --- /dev/null +++ b/Runtime/Scripts/Internal/IsExternalInit.cs @@ -0,0 +1,4 @@ +namespace System.Runtime.CompilerServices +{ + internal static class IsExternalInit { } +} diff --git a/Runtime/Scripts/Internal/IsExternalInit.cs.meta b/Runtime/Scripts/Internal/IsExternalInit.cs.meta new file mode 100644 index 00000000..191fa75d --- /dev/null +++ b/Runtime/Scripts/Internal/IsExternalInit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec0bb5ccae6f4e00919bae5e2281de66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/TokenSource/TokenSource.cs b/Runtime/Scripts/TokenSource/TokenSource.cs index b290966f..c4127a32 100644 --- a/Runtime/Scripts/TokenSource/TokenSource.cs +++ b/Runtime/Scripts/TokenSource/TokenSource.cs @@ -4,53 +4,105 @@ using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; -using UnityEngine; namespace LiveKit { - public class TokenSource : MonoBehaviour + /// + /// Marker interface for any source of LiveKit . + /// Implementations are either or . + /// + public interface ITokenSource { - [SerializeField] private TokenSourceConfig _config; + } - private static readonly string SandboxUrl = "https://cloud-api.livekit.io/api/v2/sandbox/connection-details"; - private static readonly HttpClient HttpClient = new HttpClient(); + /// + /// A token source whose connection details are fully determined at construction time and cannot be + /// influenced by per-call options (e.g. literal credentials or a user-supplied callback). + /// + public interface ITokenSourceFixed : ITokenSource + { + public Task FetchConnectionDetails(); + } - public async Task FetchConnectionDetails() + /// + /// A token source that accepts per-call to parameterize the + /// request (e.g. an HTTP endpoint that needs room/participant info per fetch). + /// + public interface ITokenSourceConfigurable : ITokenSource + { + public Task FetchConnectionDetails(TokenSourceFetchOptions options); + } + + /// + /// Returns a fixed server URL and participant token. Suitable when credentials are pregenerated + /// (e.g. via the LiveKit CLI or LiveKit Cloud project page). + /// + public class TokenSourceLiteral : ITokenSourceFixed + { + private string _serverUrl; + private string _participantToken; + + public TokenSourceLiteral(string serverUrl, string participantToken) { - if (_config == null) - throw new InvalidOperationException("Token source configuration was not provided"); - if (!_config.IsValid) - throw new InvalidOperationException("Token source configuration is invalid"); + _serverUrl = serverUrl; + _participantToken = participantToken; + } - switch (_config.TokenSourceType) - { - case TokenSourceType.Sandbox: - return await FetchFromTokenSource(SandboxUrl, new[] { new StringPair { key = "X-Sandbox-ID", value = _config.SandboxId } }); + public Task FetchConnectionDetails() + { + var result = new ConnectionDetails { ServerUrl = _serverUrl, ParticipantToken = _participantToken }; + return Task.FromResult(result); + } + } - case TokenSourceType.Endpoint: - return await FetchFromTokenSource(_config.EndpointUrl, _config.EndpointHeaders); + /// + /// Delegates connection-detail retrieval to a user-supplied async function. Use this when your + /// app already has its own token-fetching code (custom auth flow, cached tokens, etc.). + /// + public class TokenSourceCustom : ITokenSourceFixed + { + public delegate Task CustomTokenFunction(); - case TokenSourceType.Literal: - return new ConnectionDetails - { - ServerUrl = _config.ServerUrl, - ParticipantToken = _config.Token - }; + private CustomTokenFunction _customTokenFunction; - default: - throw new InvalidOperationException("Unknown token source type"); - } + public TokenSourceCustom(CustomTokenFunction customTokenFunction) + { + _customTokenFunction = customTokenFunction; + } + + public Task FetchConnectionDetails() + { + return _customTokenFunction(); + } + } + + /// + /// Posts a JSON request to a token-server endpoint and returns the parsed . + /// The body is built from per-call (room name, participant info, + /// agent dispatch, etc.). Use for production token servers — see + /// https://docs.livekit.io/frontends/build/authentication/endpoint/. + /// + public class TokenSourceEndpoint : ITokenSourceConfigurable + { + private string _endpointUrl; + IEnumerable _headers; + private static readonly HttpClient HttpClient = new HttpClient(); + + public TokenSourceEndpoint(string endpointUrl, IEnumerable headers) + { + _endpointUrl = endpointUrl; + _headers = headers; } - private async Task FetchFromTokenSource(string url, IEnumerable headers) + public async Task FetchConnectionDetails(TokenSourceFetchOptions options) { - var requestBody = BuildRequest(_config); + var requestBody = BuildRequest(options); var jsonBody = JsonConvert.SerializeObject(requestBody); - var request = new HttpRequestMessage(HttpMethod.Post, url); - if (headers != null) + var request = new HttpRequestMessage(HttpMethod.Post, _endpointUrl); + if (_headers != null) { - foreach (var header in headers) + foreach (var header in _headers) { if (!string.IsNullOrEmpty(header.key)) request.Headers.TryAddWithoutValidation(header.key, header.value); @@ -69,26 +121,26 @@ private async Task FetchFromTokenSource(string url, IEnumerab return JsonConvert.DeserializeObject(jsonContent); } - private static TokenSourceRequest BuildRequest(TokenSourceConfig config) + private static TokenSourceRequest BuildRequest(TokenSourceFetchOptions options) { var request = new TokenSourceRequest { - RoomName = NullIfEmpty(config.RoomName), - ParticipantName = NullIfEmpty(config.ParticipantName), - ParticipantIdentity = NullIfEmpty(config.ParticipantIdentity), - ParticipantMetadata = NullIfEmpty(config.ParticipantMetadata), + RoomName = NullIfEmpty(options.RoomName), + ParticipantName = NullIfEmpty(options.ParticipantName), + ParticipantIdentity = NullIfEmpty(options.ParticipantIdentity), + ParticipantMetadata = NullIfEmpty(options.ParticipantMetadata), }; - if (config.ParticipantAttributes != null && config.ParticipantAttributes.Count > 0) + if (options.ParticipantAttributes != null && options.ParticipantAttributes.Count > 0) { - request.ParticipantAttributes = config.ParticipantAttributes - .Where(a => !string.IsNullOrEmpty(a.key)) - .ToDictionary(a => a.key, a => a.value); + request.ParticipantAttributes = options.ParticipantAttributes + .Where(a => !string.IsNullOrEmpty(a.Key)) + .ToDictionary(a => a.Key, a => a.Value); if (request.ParticipantAttributes.Count == 0) request.ParticipantAttributes = null; } - if (!string.IsNullOrEmpty(config.AgentName) || !string.IsNullOrEmpty(config.AgentMetadata)) + if (!string.IsNullOrEmpty(options.AgentName) || !string.IsNullOrEmpty(options.AgentMetadata)) { request.RoomConfig = new RoomConfig { @@ -96,8 +148,8 @@ private static TokenSourceRequest BuildRequest(TokenSourceConfig config) { new AgentDispatch { - AgentName = NullIfEmpty(config.AgentName), - Metadata = NullIfEmpty(config.AgentMetadata) + AgentName = NullIfEmpty(options.AgentName), + Metadata = NullIfEmpty(options.AgentMetadata) } } }; @@ -110,49 +162,13 @@ private static string NullIfEmpty(string value) => string.IsNullOrEmpty(value) ? null : value; } - class TokenSourceRequest - { - [JsonProperty("room_name", NullValueHandling = NullValueHandling.Ignore)] - public string RoomName; - - [JsonProperty("participant_name", NullValueHandling = NullValueHandling.Ignore)] - public string ParticipantName; - - [JsonProperty("participant_identity", NullValueHandling = NullValueHandling.Ignore)] - public string ParticipantIdentity; - - [JsonProperty("participant_metadata", NullValueHandling = NullValueHandling.Ignore)] - public string ParticipantMetadata; - - [JsonProperty("participant_attributes", NullValueHandling = NullValueHandling.Ignore)] - public Dictionary ParticipantAttributes; - - [JsonProperty("room_config", NullValueHandling = NullValueHandling.Ignore)] - public RoomConfig RoomConfig; - } - - class RoomConfig - { - [JsonProperty("agents", NullValueHandling = NullValueHandling.Ignore)] - public List Agents; - } - - class AgentDispatch + /// + /// Convenience preconfigured for LiveKit Cloud sandbox token servers. + /// Intended for development and testing only — see + /// https://docs.livekit.io/frontends/build/authentication/sandbox-token-server/. + /// + public class TokenSourceSandbox : TokenSourceEndpoint { - [JsonProperty("agent_name", NullValueHandling = NullValueHandling.Ignore)] - public string AgentName; - - [JsonProperty("metadata", NullValueHandling = NullValueHandling.Ignore)] - public string Metadata; - } - - [Serializable] - public struct ConnectionDetails - { - [JsonProperty("server_url")] - public string ServerUrl; - - [JsonProperty("participant_token")] - public string ParticipantToken; + public TokenSourceSandbox(string sandboxId) : base("https://cloud-api.livekit.io/api/v2/sandbox/connection-details", new[] { new StringPair { key = "X-Sandbox-ID", value = sandboxId } }) {} } -} +} \ No newline at end of file diff --git a/Runtime/Scripts/TokenSource/TokenSource.cs.meta b/Runtime/Scripts/TokenSource/TokenSource.cs.meta index b527675e..2c16ff9e 100644 --- a/Runtime/Scripts/TokenSource/TokenSource.cs.meta +++ b/Runtime/Scripts/TokenSource/TokenSource.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a498c208deeab40c39b4ba609d7d222c +guid: 59c24a8c1f87549c3b732a0dd9e1012e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/Scripts/TokenSource/TokenSourceComponent.cs b/Runtime/Scripts/TokenSource/TokenSourceComponent.cs new file mode 100644 index 00000000..3b9ccfe0 --- /dev/null +++ b/Runtime/Scripts/TokenSource/TokenSourceComponent.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEngine; + +namespace LiveKit +{ + /// + /// MonoBehaviour wrapper that builds an from an inspector-assigned + /// ScriptableObject. To skip the asset entirely, instantiate + /// , , , + /// or directly at runtime. + /// + public class TokenSourceComponent : MonoBehaviour + { + [SerializeField] private TokenSourceComponentConfig _config; + + /// + /// Fetches connection details using only the values on the asset-backed + /// . Equivalent to FetchConnectionDetails(null). + /// + public Task FetchConnectionDetails() => FetchConnectionDetails(null); + + ITokenSource _tokenSource; + + public void Start() + { + if (_config == null) + throw new InvalidOperationException("Token source configuration was not provided"); + if (!_config.IsValid) + throw new InvalidOperationException("Token source configuration is invalid"); + + switch (_config.TokenSourceType) + { + case TokenSourceType.Sandbox: + _tokenSource = new TokenSourceSandbox(_config.SandboxId); + break; + + case TokenSourceType.Endpoint: + _tokenSource = new TokenSourceEndpoint(_config.EndpointUrl, _config.EndpointHeaders); + break; + + case TokenSourceType.Literal: + _tokenSource = new TokenSourceLiteral(_config.ServerUrl, _config.Token); + break; + + default: + throw new InvalidOperationException("Unknown token source type"); + } + } + + /// + /// Fetches connection details, merging per-call over the asset-backed + /// . For each field, a value provided on + /// overrides the config value (empty strings are treated as unset and fall through to the config). + /// Ignored for fixed token sources (, ). + /// + public async Task FetchConnectionDetails(TokenSourceFetchOptions? options) + { + switch (_tokenSource) + { + case ITokenSourceConfigurable configurableSource: + return await configurableSource.FetchConnectionDetails(Coalesce(_config, options)); + + case ITokenSourceFixed fixedSource: + if (options != null) + Debug.LogWarning("TokenSourceComponent uses a fixed config, so fetch options are ignored."); + return await fixedSource.FetchConnectionDetails(); + + default: + throw new InvalidOperationException("Unknown token source type"); + } + } + + private static TokenSourceFetchOptions Coalesce(TokenSourceComponentConfig config, TokenSourceFetchOptions? options) + { + Dictionary participantAttributes = null; + if (options?.ParticipantAttributes != null) + { + var attrs = options.ParticipantAttributes + .Where(kv => !string.IsNullOrEmpty(kv.Key)) + .ToDictionary(kv => kv.Key, kv => kv.Value); + if (attrs.Count > 0) + participantAttributes = attrs; + } + else if (config.ParticipantAttributes != null && config.ParticipantAttributes.Count > 0) + { + var attrs = config.ParticipantAttributes + .Where(a => !string.IsNullOrEmpty(a.key)) + .ToDictionary(a => a.key, a => a.value); + if (attrs.Count > 0) + participantAttributes = attrs; + } + + return new TokenSourceFetchOptions + { + RoomName = Coalesce(options?.RoomName, config.RoomName), + ParticipantName = Coalesce(options?.ParticipantName, config.ParticipantName), + ParticipantIdentity = Coalesce(options?.ParticipantIdentity, config.ParticipantIdentity), + ParticipantMetadata = Coalesce(options?.ParticipantMetadata, config.ParticipantMetadata), + ParticipantAttributes = participantAttributes, + AgentName = Coalesce(options?.AgentName, config.AgentName), + AgentMetadata = Coalesce(options?.AgentMetadata, config.AgentMetadata), + }; + } + + private static string NullIfEmpty(string value) => + string.IsNullOrEmpty(value) ? null : value; + + private static string Coalesce(string primary, string fallback) => + NullIfEmpty(primary) ?? NullIfEmpty(fallback); + } +} diff --git a/Runtime/Scripts/TokenSource/TokenSourceComponent.cs.meta b/Runtime/Scripts/TokenSource/TokenSourceComponent.cs.meta new file mode 100644 index 00000000..b527675e --- /dev/null +++ b/Runtime/Scripts/TokenSource/TokenSourceComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a498c208deeab40c39b4ba609d7d222c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/TokenSource/TokenSourceConfig.cs b/Runtime/Scripts/TokenSource/TokenSourceComponentConfig.cs similarity index 93% rename from Runtime/Scripts/TokenSource/TokenSourceConfig.cs rename to Runtime/Scripts/TokenSource/TokenSourceComponentConfig.cs index 4bfa484a..6b04ce70 100644 --- a/Runtime/Scripts/TokenSource/TokenSourceConfig.cs +++ b/Runtime/Scripts/TokenSource/TokenSourceComponentConfig.cs @@ -18,8 +18,8 @@ public struct StringPair public string value; } - [CreateAssetMenu(fileName = "TokenSourceConfig", menuName = "LiveKit/TokenSourceConfig")] - public class TokenSourceConfig : ScriptableObject + [CreateAssetMenu(fileName = "TokenSourceComponentConfig", menuName = "LiveKit/TokenSourceComponentConfig")] + public class TokenSourceComponentConfig : ScriptableObject { [SerializeField] private TokenSourceType _tokenSourceType; diff --git a/Runtime/Scripts/TokenSource/TokenSourceConfig.cs.meta b/Runtime/Scripts/TokenSource/TokenSourceComponentConfig.cs.meta similarity index 100% rename from Runtime/Scripts/TokenSource/TokenSourceConfig.cs.meta rename to Runtime/Scripts/TokenSource/TokenSourceComponentConfig.cs.meta diff --git a/Runtime/Scripts/TokenSource/TokenSourceData.cs b/Runtime/Scripts/TokenSource/TokenSourceData.cs new file mode 100644 index 00000000..0a76fcfc --- /dev/null +++ b/Runtime/Scripts/TokenSource/TokenSourceData.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace LiveKit +{ + /// + /// Per-call overrides passed to . + /// + public class TokenSourceFetchOptions + { + public string RoomName { get; init; } + public string ParticipantName { get; init; } + public string ParticipantIdentity { get; init; } + public string ParticipantMetadata { get; init; } + public Dictionary ParticipantAttributes { get; init; } + public string AgentName { get; init; } + public string AgentMetadata { get; init; } + } + + class TokenSourceRequest + { + [JsonProperty("room_name", NullValueHandling = NullValueHandling.Ignore)] + public string RoomName; + + [JsonProperty("participant_name", NullValueHandling = NullValueHandling.Ignore)] + public string ParticipantName; + + [JsonProperty("participant_identity", NullValueHandling = NullValueHandling.Ignore)] + public string ParticipantIdentity; + + [JsonProperty("participant_metadata", NullValueHandling = NullValueHandling.Ignore)] + public string ParticipantMetadata; + + [JsonProperty("participant_attributes", NullValueHandling = NullValueHandling.Ignore)] + public Dictionary ParticipantAttributes; + + [JsonProperty("room_config", NullValueHandling = NullValueHandling.Ignore)] + public RoomConfig RoomConfig; + } + + class RoomConfig + { + [JsonProperty("agents", NullValueHandling = NullValueHandling.Ignore)] + public List Agents; + } + + class AgentDispatch + { + [JsonProperty("agent_name", NullValueHandling = NullValueHandling.Ignore)] + public string AgentName; + + [JsonProperty("metadata", NullValueHandling = NullValueHandling.Ignore)] + public string Metadata; + } + + /// + /// Server URL and participant token returned by a token source, ready to pass to + /// Room.Connect. + /// + public class ConnectionDetails + { + [JsonProperty("server_url")] + public string ServerUrl; + + [JsonProperty("participant_token")] + public string ParticipantToken; + } +} diff --git a/Runtime/Scripts/TokenSource/TokenSourceData.cs.meta b/Runtime/Scripts/TokenSource/TokenSourceData.cs.meta new file mode 100644 index 00000000..636b5dcf --- /dev/null +++ b/Runtime/Scripts/TokenSource/TokenSourceData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59f055263c30438bbdfc408c01d14031 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples~/Meet/Assets/Runtime/MeetManager.cs b/Samples~/Meet/Assets/Runtime/MeetManager.cs index fe684746..5d97e85a 100644 --- a/Samples~/Meet/Assets/Runtime/MeetManager.cs +++ b/Samples~/Meet/Assets/Runtime/MeetManager.cs @@ -15,7 +15,7 @@ /// /// Manages a LiveKit room connection with local/remote audio and video tracks. /// -[RequireComponent(typeof(TokenSource))] +[RequireComponent(typeof(TokenSourceComponent))] public class MeetManager : MonoBehaviour { private const string LocalVideoTrackName = "my-video-track"; @@ -37,7 +37,7 @@ public class MeetManager : MonoBehaviour [SerializeField] private GridLayoutGroup videoTrackParent; [SerializeField] private int frameRate = 30; - private TokenSource _tokenSource; + private TokenSourceComponent _tokenSourceComponent; private Room _room; private WebCamTexture _webCamTexture; private Transform _audioTrackParent; @@ -59,7 +59,7 @@ public class MeetManager : MonoBehaviour private void Start() { - _tokenSource = GetComponent(); + _tokenSourceComponent = GetComponent(); startCallButton.onClick.AddListener(OnStartCall); endCallButton.onClick.AddListener(OnEndCall); cameraButton.onClick.AddListener(OnToggleCamera); @@ -155,7 +155,7 @@ private IEnumerator ConnectToRoom() { if (_room != null) yield break; - var connectionDetailsTask = _tokenSource.FetchConnectionDetails(); + var connectionDetailsTask = _tokenSourceComponent.FetchConnectionDetails(new TokenSourceFetchOptions()); yield return new WaitUntil(() => connectionDetailsTask.IsCompleted); if (connectionDetailsTask.IsFaulted) diff --git a/Samples~/Meet/Assets/Runtime/TokenSourceConfig.asset b/Samples~/Meet/Assets/Runtime/TokenSourceComponentConfig.asset similarity index 94% rename from Samples~/Meet/Assets/Runtime/TokenSourceConfig.asset rename to Samples~/Meet/Assets/Runtime/TokenSourceComponentConfig.asset index ce15f32d..4721579a 100644 --- a/Samples~/Meet/Assets/Runtime/TokenSourceConfig.asset +++ b/Samples~/Meet/Assets/Runtime/TokenSourceComponentConfig.asset @@ -10,7 +10,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 43a37cf88c3004e1e868c55101f680a5, type: 3} - m_Name: TokenSourceConfig + m_Name: TokenSourceComponentConfig m_EditorClassIdentifier: _tokenSourceType: 0 _serverUrl: diff --git a/Samples~/Meet/Assets/Runtime/TokenSourceConfig.asset.meta b/Samples~/Meet/Assets/Runtime/TokenSourceComponentConfig.asset.meta similarity index 100% rename from Samples~/Meet/Assets/Runtime/TokenSourceConfig.asset.meta rename to Samples~/Meet/Assets/Runtime/TokenSourceComponentConfig.asset.meta