Skip to content

Commit 29befb9

Browse files
authored
Make TokenProvider not contain state so subclassing actually works correctly with JIT requested tokens (for long lived ApiClients) (#22233)
1 parent 3f9465e commit 29befb9

File tree

144 files changed

+499
-1507
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+499
-1507
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)
@@ -86,7 +85,7 @@ namespace {{packageName}}.{{clientPackage}}
8685
}
8786

8887
/// <inheritdoc/>
89-
protected internal override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}})
88+
public override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}})
9089
{
9190
if (!AvailableTokens.TryGetValue(header, out global::System.Threading.Channels.Channel<TTokenBase>{{nrt?}} tokens))
9291
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 & 21 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,25 +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-
/// <summary>
26-
/// Gets an authentication token to be used in request authorization.
27-
/// </summary>
28-
/// <param name="header"></param>
29-
/// <param name="cancellation"></param>
30-
protected internal abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}});
31-
32-
/// <summary>
33-
/// Instantiates a TokenProvider.
34-
/// </summary>
35-
/// <param name="tokens"></param>
36-
public TokenProvider(IEnumerable<TTokenBase> tokens)
37-
{
38-
_tokens = tokens.ToArray();
39-
}
19+
public abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}});
4020
}
4121
}

samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/RateLimitProvider`1.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
* The version of the OpenAPI document: 0.0.1
88
* Generated by: https://github.com/openapitools/openapi-generator.git
99
*/
10-
1110
#nullable enable
1211

1312
using System;
@@ -22,33 +21,33 @@ namespace Org.OpenAPITools.Client
2221
/// <typeparam name="TTokenBase"></typeparam>
2322
public class RateLimitProvider<TTokenBase> : TokenProvider<TTokenBase> where TTokenBase : TokenBase
2423
{
25-
internal Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new();
24+
public Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new();
2625

2726
/// <summary>
2827
/// Instantiates a ThrottledTokenProvider. Your tokens will be rate limited based on the token's timeout.
2928
/// </summary>
3029
/// <param name="container"></param>
31-
public RateLimitProvider(TokenContainer<TTokenBase> container) : base(container.Tokens)
30+
public RateLimitProvider(TokenContainer<TTokenBase> container) : base()
3231
{
33-
foreach(TTokenBase token in _tokens)
32+
foreach(TTokenBase token in container.Tokens)
3433
token.StartTimer(token.Timeout ?? TimeSpan.FromMilliseconds(40));
3534

36-
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(_tokens.Length)
35+
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(container.Tokens.Count)
3736
{
38-
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
37+
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
3938
};
4039

4140
AvailableTokens.Add(string.Empty, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
4241

4342
foreach (var availableToken in AvailableTokens)
44-
foreach(TTokenBase token in _tokens)
43+
foreach(TTokenBase token in container.Tokens)
4544
{
4645
token.TokenBecameAvailable += ((sender) => availableToken.Value.Writer.TryWrite((TTokenBase)sender));
4746
}
4847
}
4948

5049
/// <inheritdoc/>
51-
protected internal override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
50+
public override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
5251
{
5352
if (!AvailableTokens.TryGetValue(header, out global::System.Threading.Channels.Channel<TTokenBase>? tokens))
5453
throw new KeyNotFoundException($"Could not locate a token for header '{header}'.");

samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/TokenBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public abstract class TokenBase
1717

1818

1919
internal TimeSpan? Timeout { get; set; }
20-
internal delegate void TokenBecameAvailableEventHandler(object sender);
21-
internal event TokenBecameAvailableEventHandler? TokenBecameAvailable;
20+
public delegate void TokenBecameAvailableEventHandler(object sender);
21+
public event TokenBecameAvailableEventHandler? TokenBecameAvailable;
2222

2323

2424
/// <summary>

samples/client/petstore/csharp/generichost/latest/ComposedEnum/src/Org.OpenAPITools/Client/TokenProvider`1.cs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
* The version of the OpenAPI document: 0.0.1
88
* Generated by: https://github.com/openapitools/openapi-generator.git
99
*/
10-
1110
#nullable enable
1211

1312
using System;
@@ -22,25 +21,6 @@ namespace Org.OpenAPITools
2221
/// </summary>
2322
public abstract class TokenProvider<TTokenBase> where TTokenBase : TokenBase
2423
{
25-
/// <summary>
26-
/// The array of tokens.
27-
/// </summary>
28-
protected TTokenBase[] _tokens;
29-
30-
/// <summary>
31-
/// Gets an authentication token to be used in request authorization.
32-
/// </summary>
33-
/// <param name="header"></param>
34-
/// <param name="cancellation"></param>
35-
protected internal abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default);
36-
37-
/// <summary>
38-
/// Instantiates a TokenProvider.
39-
/// </summary>
40-
/// <param name="tokens"></param>
41-
public TokenProvider(IEnumerable<TTokenBase> tokens)
42-
{
43-
_tokens = tokens.ToArray();
44-
}
24+
public abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default);
4525
}
4626
}

samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/RateLimitProvider`1.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
* The version of the OpenAPI document: 1.0.0
88
* Generated by: https://github.com/openapitools/openapi-generator.git
99
*/
10-
1110
#nullable enable
1211

1312
using System;
@@ -22,33 +21,33 @@ namespace Org.OpenAPITools.Client
2221
/// <typeparam name="TTokenBase"></typeparam>
2322
public class RateLimitProvider<TTokenBase> : TokenProvider<TTokenBase> where TTokenBase : TokenBase
2423
{
25-
internal Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new();
24+
public Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new();
2625

2726
/// <summary>
2827
/// Instantiates a ThrottledTokenProvider. Your tokens will be rate limited based on the token's timeout.
2928
/// </summary>
3029
/// <param name="container"></param>
31-
public RateLimitProvider(TokenContainer<TTokenBase> container) : base(container.Tokens)
30+
public RateLimitProvider(TokenContainer<TTokenBase> container) : base()
3231
{
33-
foreach(TTokenBase token in _tokens)
32+
foreach(TTokenBase token in container.Tokens)
3433
token.StartTimer(token.Timeout ?? TimeSpan.FromMilliseconds(40));
3534

36-
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(_tokens.Length)
35+
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(container.Tokens.Count)
3736
{
38-
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
37+
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
3938
};
4039

4140
AvailableTokens.Add(string.Empty, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
4241

4342
foreach (var availableToken in AvailableTokens)
44-
foreach(TTokenBase token in _tokens)
43+
foreach(TTokenBase token in container.Tokens)
4544
{
4645
token.TokenBecameAvailable += ((sender) => availableToken.Value.Writer.TryWrite((TTokenBase)sender));
4746
}
4847
}
4948

5049
/// <inheritdoc/>
51-
protected internal override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
50+
public override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
5251
{
5352
if (!AvailableTokens.TryGetValue(header, out global::System.Threading.Channels.Channel<TTokenBase>? tokens))
5453
throw new KeyNotFoundException($"Could not locate a token for header '{header}'.");

samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/TokenBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public abstract class TokenBase
1717

1818

1919
internal TimeSpan? Timeout { get; set; }
20-
internal delegate void TokenBecameAvailableEventHandler(object sender);
21-
internal event TokenBecameAvailableEventHandler? TokenBecameAvailable;
20+
public delegate void TokenBecameAvailableEventHandler(object sender);
21+
public event TokenBecameAvailableEventHandler? TokenBecameAvailable;
2222

2323

2424
/// <summary>

samples/client/petstore/csharp/generichost/latest/HelloWorld/src/Org.OpenAPITools/Client/TokenProvider`1.cs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
* The version of the OpenAPI document: 1.0.0
88
* Generated by: https://github.com/openapitools/openapi-generator.git
99
*/
10-
1110
#nullable enable
1211

1312
using System;
@@ -22,25 +21,6 @@ namespace Org.OpenAPITools
2221
/// </summary>
2322
public abstract class TokenProvider<TTokenBase> where TTokenBase : TokenBase
2423
{
25-
/// <summary>
26-
/// The array of tokens.
27-
/// </summary>
28-
protected TTokenBase[] _tokens;
29-
30-
/// <summary>
31-
/// Gets an authentication token to be used in request authorization.
32-
/// </summary>
33-
/// <param name="header"></param>
34-
/// <param name="cancellation"></param>
35-
protected internal abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default);
36-
37-
/// <summary>
38-
/// Instantiates a TokenProvider.
39-
/// </summary>
40-
/// <param name="tokens"></param>
41-
public TokenProvider(IEnumerable<TTokenBase> tokens)
42-
{
43-
_tokens = tokens.ToArray();
44-
}
24+
public abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default);
4525
}
4626
}

samples/client/petstore/csharp/generichost/latest/InlineEnumAnyOf/src/Org.OpenAPITools/Client/RateLimitProvider`1.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
* The version of the OpenAPI document: 1.0.0
88
* Generated by: https://github.com/openapitools/openapi-generator.git
99
*/
10-
1110
#nullable enable
1211

1312
using System;
@@ -22,33 +21,33 @@ namespace Org.OpenAPITools.Client
2221
/// <typeparam name="TTokenBase"></typeparam>
2322
public class RateLimitProvider<TTokenBase> : TokenProvider<TTokenBase> where TTokenBase : TokenBase
2423
{
25-
internal Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new();
24+
public Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new();
2625

2726
/// <summary>
2827
/// Instantiates a ThrottledTokenProvider. Your tokens will be rate limited based on the token's timeout.
2928
/// </summary>
3029
/// <param name="container"></param>
31-
public RateLimitProvider(TokenContainer<TTokenBase> container) : base(container.Tokens)
30+
public RateLimitProvider(TokenContainer<TTokenBase> container) : base()
3231
{
33-
foreach(TTokenBase token in _tokens)
32+
foreach(TTokenBase token in container.Tokens)
3433
token.StartTimer(token.Timeout ?? TimeSpan.FromMilliseconds(40));
3534

36-
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(_tokens.Length)
35+
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(container.Tokens.Count)
3736
{
38-
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
37+
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
3938
};
4039

4140
AvailableTokens.Add(string.Empty, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
4241

4342
foreach (var availableToken in AvailableTokens)
44-
foreach(TTokenBase token in _tokens)
43+
foreach(TTokenBase token in container.Tokens)
4544
{
4645
token.TokenBecameAvailable += ((sender) => availableToken.Value.Writer.TryWrite((TTokenBase)sender));
4746
}
4847
}
4948

5049
/// <inheritdoc/>
51-
protected internal override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
50+
public override async System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default)
5251
{
5352
if (!AvailableTokens.TryGetValue(header, out global::System.Threading.Channels.Channel<TTokenBase>? tokens))
5453
throw new KeyNotFoundException($"Could not locate a token for header '{header}'.");

0 commit comments

Comments
 (0)