Skip to content

Commit 3fd1496

Browse files
authored
Making the raw TokenSource classes available to coroutines and unitasks (#356)
1 parent 1f5ef98 commit 3fd1496

2 files changed

Lines changed: 30 additions & 14 deletions

File tree

Runtime/Scripts/TokenSource/TokenSource.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Net.Http;
55
using System.Threading.Tasks;
6+
using LiveKit.Internal.Threading;
67
using Newtonsoft.Json;
78

89
namespace LiveKit
@@ -21,7 +22,7 @@ public interface ITokenSource
2122
/// </summary>
2223
public interface ITokenSourceFixed : ITokenSource
2324
{
24-
public Task<ConnectionDetails> FetchConnectionDetails();
25+
public TaskYieldInstruction<ConnectionDetails> FetchConnectionDetails();
2526
}
2627

2728
/// <summary>
@@ -30,7 +31,7 @@ public interface ITokenSourceFixed : ITokenSource
3031
/// </summary>
3132
public interface ITokenSourceConfigurable : ITokenSource
3233
{
33-
public Task<ConnectionDetails> FetchConnectionDetails(TokenSourceFetchOptions options);
34+
public TaskYieldInstruction<ConnectionDetails> FetchConnectionDetails(TokenSourceFetchOptions options);
3435
}
3536

3637
/// <summary>
@@ -48,10 +49,10 @@ public TokenSourceLiteral(string serverUrl, string participantToken)
4849
_participantToken = participantToken;
4950
}
5051

51-
public Task<ConnectionDetails> FetchConnectionDetails()
52+
public TaskYieldInstruction<ConnectionDetails> FetchConnectionDetails()
5253
{
5354
var result = new ConnectionDetails { ServerUrl = _serverUrl, ParticipantToken = _participantToken };
54-
return Task.FromResult(result);
55+
return new TaskYieldInstruction<ConnectionDetails>(Task.FromResult(result));
5556
}
5657
}
5758

@@ -70,9 +71,22 @@ public TokenSourceCustom(CustomTokenFunction customTokenFunction)
7071
_customTokenFunction = customTokenFunction;
7172
}
7273

73-
public Task<ConnectionDetails> FetchConnectionDetails()
74+
public TaskYieldInstruction<ConnectionDetails> FetchConnectionDetails()
7475
{
75-
return _customTokenFunction();
76+
// Route a synchronous throw (or a null return) from the user's function through the
77+
// instruction's IsError/Exception, so callers never have to guard the call itself.
78+
Task<ConnectionDetails> task;
79+
try
80+
{
81+
task = _customTokenFunction()
82+
?? Task.FromException<ConnectionDetails>(
83+
new InvalidOperationException("Custom token function returned a null task"));
84+
}
85+
catch (Exception e)
86+
{
87+
task = Task.FromException<ConnectionDetails>(e);
88+
}
89+
return new TaskYieldInstruction<ConnectionDetails>(task);
7690
}
7791
}
7892

@@ -94,7 +108,14 @@ public TokenSourceEndpoint(string endpointUrl, IEnumerable<StringPair> headers)
94108
_headers = headers;
95109
}
96110

97-
public async Task<ConnectionDetails> FetchConnectionDetails(TokenSourceFetchOptions options)
111+
public TaskYieldInstruction<ConnectionDetails> FetchConnectionDetails(TokenSourceFetchOptions options)
112+
{
113+
// Async methods can't return the (non-awaitable) instruction directly, so the actual
114+
// request lives in the helper below; the returned task carries any synchronous throw.
115+
return new TaskYieldInstruction<ConnectionDetails>(FetchConnectionDetailsAsync(options));
116+
}
117+
118+
private async Task<ConnectionDetails> FetchConnectionDetailsAsync(TokenSourceFetchOptions options)
98119
{
99120
var requestBody = BuildRequest(options);
100121
var jsonBody = JsonConvert.SerializeObject(requestBody);

Runtime/Scripts/TokenSource/TokenSourceComponent.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Threading.Tasks;
54
using UnityEngine;
65
using LiveKit.Internal;
76

@@ -60,23 +59,19 @@ public void Awake()
6059
/// </summary>
6160
public TaskYieldInstruction<ConnectionDetails> FetchConnectionDetails(TokenSourceFetchOptions options)
6261
{
63-
Task<ConnectionDetails> task;
6462
switch (_tokenSource)
6563
{
6664
case ITokenSourceConfigurable configurableSource:
67-
task = configurableSource.FetchConnectionDetails(Coalesce(_config, options));
68-
break;
65+
return configurableSource.FetchConnectionDetails(Coalesce(_config, options));
6966

7067
case ITokenSourceFixed fixedSource:
7168
if (options != null)
7269
Utils.Warning("TokenSourceComponent uses a fixed config, so fetch options are ignored.");
73-
task = fixedSource.FetchConnectionDetails();
74-
break;
70+
return fixedSource.FetchConnectionDetails();
7571

7672
default:
7773
throw new InvalidOperationException("Unknown token source type");
7874
}
79-
return new TaskYieldInstruction<ConnectionDetails>(task);
8075
}
8176

8277
private static TokenSourceFetchOptions Coalesce(TokenSourceComponentConfig config, TokenSourceFetchOptions? options)

0 commit comments

Comments
 (0)