Skip to content

Commit a98c339

Browse files
committed
Make TokenProvider not contain state so subclassing actually works correctly with JIT requested tokens (for long lived ApiClients)
1 parent 74ab0ef commit a98c339

File tree

3 files changed

+11
-30
lines changed

3 files changed

+11
-30
lines changed

modules/openapi-generator/src/main/resources/csharp/libraries/generichost/RateLimitProvider`1.mustache

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// <auto-generated>
22
{{>partial_header}}
3-
43
{{#nrt}}
54
#nullable enable
65

@@ -17,21 +16,21 @@ namespace {{packageName}}.{{clientPackage}}
1716
/// <typeparam name="TTokenBase"></typeparam>
1817
{{>visibility}} class RateLimitProvider<TTokenBase> : TokenProvider<TTokenBase> where TTokenBase : TokenBase
1918
{
20-
internal Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new{{^net70OrLater}} Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>>{{/net70OrLater}}();
19+
public Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new{{^net70OrLater}} Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>>{{/net70OrLater}}();
2120

2221
/// <summary>
2322
/// Instantiates a ThrottledTokenProvider. Your tokens will be rate limited based on the token's timeout.
2423
/// </summary>
2524
/// <param name="container"></param>
26-
public RateLimitProvider(TokenContainer<TTokenBase> container) : base(container.Tokens)
25+
public RateLimitProvider(TokenContainer<TTokenBase> container) : base()
2726
{
28-
foreach(TTokenBase token in _tokens)
27+
foreach(TTokenBase token in container.Tokens)
2928
token.StartTimer(token.Timeout ?? TimeSpan.FromMilliseconds(40));
3029
3130
{{#lambda.copy}}
32-
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(_tokens.Length)
31+
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(container.Tokens.Count)
3332
{
34-
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
33+
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
3534
};
3635

3736
AvailableTokens.Add(string.Empty, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
@@ -45,7 +44,7 @@ namespace {{packageName}}.{{clientPackage}}
4544
{
4645
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(apiKeyTokenContainer.Tokens.Count(t => ClientUtils.ApiKeyHeaderToString(t.Header).Equals(header)))
4746
{
48-
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
47+
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
4948
};
5049

5150
AvailableTokens.Add(header, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
@@ -65,7 +64,7 @@ namespace {{packageName}}.{{clientPackage}}
6564
{{/hasApiKeyMethods}}
6665

6766
foreach (var availableToken in AvailableTokens)
68-
foreach(TTokenBase token in _tokens)
67+
foreach(TTokenBase token in container.Tokens)
6968
{
7069
{{#hasApiKeyMethods}}
7170
if (token is ApiKeyToken apiKeyToken)
@@ -85,7 +84,7 @@ namespace {{packageName}}.{{clientPackage}}
8584
}
8685
}
8786

88-
internal override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}})
87+
public override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}})
8988
{
9089
if (!AvailableTokens.TryGetValue(header, out global::System.Threading.Channels.Channel<TTokenBase>{{nrt?}} tokens))
9190
throw new KeyNotFoundException($"Could not locate a token for header '{header}'.");

modules/openapi-generator/src/main/resources/csharp/libraries/generichost/TokenBase.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ namespace {{packageName}}.{{clientPackage}}
1919
2020
2121
internal TimeSpan? Timeout { get; set; }
22-
internal delegate void TokenBecameAvailableEventHandler(object sender);
23-
internal event TokenBecameAvailableEventHandler{{nrt?}} TokenBecameAvailable;
22+
public delegate void TokenBecameAvailableEventHandler(object sender);
23+
public event TokenBecameAvailableEventHandler{{nrt?}} TokenBecameAvailable;
2424

2525

2626
/// <summary>
Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// <auto-generated>
22
{{>partial_header}}
3-
43
{{#nrt}}
54
#nullable enable
65

@@ -17,23 +16,6 @@ namespace {{packageName}}
1716
/// </summary>
1817
{{>visibility}} abstract class TokenProvider<TTokenBase> where TTokenBase : TokenBase
1918
{
20-
/// <summary>
21-
/// The array of tokens.
22-
/// </summary>
23-
protected TTokenBase[] _tokens;
24-
25-
internal abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}});
26-
27-
/// <summary>
28-
/// Instantiates a TokenProvider.
29-
/// </summary>
30-
/// <param name="tokens"></param>
31-
public TokenProvider(IEnumerable<TTokenBase> tokens)
32-
{
33-
_tokens = tokens.ToArray();
34-
35-
if (_tokens.Length == 0)
36-
throw new ArgumentException("You did not provide any tokens.");
37-
}
19+
public abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}});
3820
}
3921
}

0 commit comments

Comments
 (0)