Skip to content

Commit 810487b

Browse files
feat(client): add cancellation token support
1 parent a58c5a8 commit 810487b

23 files changed

+376
-120
lines changed

src/ArcadeDotnet/ArcadeClient.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,22 @@ public IWorkerService Workers
8888
get { return _workers.Value; }
8989
}
9090

91-
public async Task<HttpResponse> Execute<T>(HttpRequest<T> request)
91+
public async Task<HttpResponse> Execute<T>(
92+
HttpRequest<T> request,
93+
CancellationToken cancellationToken = default
94+
)
9295
where T : ParamsBase
9396
{
9497
using HttpRequestMessage requestMessage = new(request.Method, request.Params.Url(this))
9598
{
9699
Content = request.Params.BodyContent(),
97100
};
98101
request.Params.AddHeadersToRequest(requestMessage, this);
99-
using CancellationTokenSource cts = new(this.Timeout);
102+
using CancellationTokenSource timeoutCts = new(this.Timeout);
103+
using var cts = CancellationTokenSource.CreateLinkedTokenSource(
104+
timeoutCts.Token,
105+
cancellationToken
106+
);
100107
HttpResponseMessage responseMessage;
101108
try
102109
{
@@ -118,7 +125,7 @@ public async Task<HttpResponse> Execute<T>(HttpRequest<T> request)
118125
{
119126
throw ArcadeExceptionFactory.CreateApiException(
120127
responseMessage.StatusCode,
121-
await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false)
128+
await responseMessage.Content.ReadAsStringAsync(cts.Token).ConfigureAwait(false)
122129
);
123130
}
124131
catch (HttpRequestException e)
@@ -130,7 +137,7 @@ await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false)
130137
responseMessage.Dispose();
131138
}
132139
}
133-
return new() { Message = responseMessage };
140+
return new() { Message = responseMessage, CancellationToken = cts.Token };
134141
}
135142

136143
public ArcadeClient()

src/ArcadeDotnet/Core/HttpResponse.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Net.Http;
33
using System.Text.Json;
4+
using System.Threading;
45
using System.Threading.Tasks;
56
using ArcadeDotnet.Exceptions;
67

@@ -10,12 +11,18 @@ public sealed class HttpResponse : IDisposable
1011
{
1112
public required HttpResponseMessage Message { get; init; }
1213

13-
public async Task<T> Deserialize<T>()
14+
public CancellationToken CancellationToken { get; init; } = default;
15+
16+
public async Task<T> Deserialize<T>(CancellationToken cancellationToken = default)
1417
{
18+
using var cts = CancellationTokenSource.CreateLinkedTokenSource(
19+
this.CancellationToken,
20+
cancellationToken
21+
);
1522
try
1623
{
1724
return JsonSerializer.Deserialize<T>(
18-
await Message.Content.ReadAsStreamAsync().ConfigureAwait(false),
25+
await Message.Content.ReadAsStreamAsync(cts.Token).ConfigureAwait(false),
1926
ModelBase.SerializerOptions
2027
) ?? throw new ArcadeInvalidDataException("Response cannot be null");
2128
}

src/ArcadeDotnet/IArcadeClient.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Net.Http;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using ArcadeDotnet.Core;
56
using ArcadeDotnet.Services.Admin;
@@ -40,6 +41,9 @@ public interface IArcadeClient
4041

4142
IWorkerService Workers { get; }
4243

43-
Task<HttpResponse> Execute<T>(HttpRequest<T> request)
44+
Task<HttpResponse> Execute<T>(
45+
HttpRequest<T> request,
46+
CancellationToken cancellationToken = default
47+
)
4448
where T : ParamsBase;
4549
}

src/ArcadeDotnet/Services/Admin/AuthProviders/AuthProviderService.cs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Net.Http;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using ArcadeDotnet.Core;
56
using AuthProviders = ArcadeDotnet.Models.Admin.AuthProviders;
@@ -21,17 +22,20 @@ public AuthProviderService(IArcadeClient client)
2122
}
2223

2324
public async Task<AuthProviders::AuthProviderResponse> Create(
24-
AuthProviders::AuthProviderCreateParams parameters
25+
AuthProviders::AuthProviderCreateParams parameters,
26+
CancellationToken cancellationToken = default
2527
)
2628
{
2729
HttpRequest<AuthProviders::AuthProviderCreateParams> request = new()
2830
{
2931
Method = HttpMethod.Post,
3032
Params = parameters,
3133
};
32-
using var response = await this._client.Execute(request).ConfigureAwait(false);
34+
using var response = await this
35+
._client.Execute(request, cancellationToken)
36+
.ConfigureAwait(false);
3337
var authProviderResponse = await response
34-
.Deserialize<AuthProviders::AuthProviderResponse>()
38+
.Deserialize<AuthProviders::AuthProviderResponse>(cancellationToken)
3539
.ConfigureAwait(false);
3640
if (this._client.ResponseValidation)
3741
{
@@ -41,7 +45,8 @@ public AuthProviderService(IArcadeClient client)
4145
}
4246

4347
public async Task<AuthProviders::AuthProviderListResponse> List(
44-
AuthProviders::AuthProviderListParams? parameters = null
48+
AuthProviders::AuthProviderListParams? parameters = null,
49+
CancellationToken cancellationToken = default
4550
)
4651
{
4752
parameters ??= new();
@@ -51,9 +56,11 @@ public AuthProviderService(IArcadeClient client)
5156
Method = HttpMethod.Get,
5257
Params = parameters,
5358
};
54-
using var response = await this._client.Execute(request).ConfigureAwait(false);
59+
using var response = await this
60+
._client.Execute(request, cancellationToken)
61+
.ConfigureAwait(false);
5562
var authProviders = await response
56-
.Deserialize<AuthProviders::AuthProviderListResponse>()
63+
.Deserialize<AuthProviders::AuthProviderListResponse>(cancellationToken)
5764
.ConfigureAwait(false);
5865
if (this._client.ResponseValidation)
5966
{
@@ -63,17 +70,20 @@ public AuthProviderService(IArcadeClient client)
6370
}
6471

6572
public async Task<AuthProviders::AuthProviderResponse> Delete(
66-
AuthProviders::AuthProviderDeleteParams parameters
73+
AuthProviders::AuthProviderDeleteParams parameters,
74+
CancellationToken cancellationToken = default
6775
)
6876
{
6977
HttpRequest<AuthProviders::AuthProviderDeleteParams> request = new()
7078
{
7179
Method = HttpMethod.Delete,
7280
Params = parameters,
7381
};
74-
using var response = await this._client.Execute(request).ConfigureAwait(false);
82+
using var response = await this
83+
._client.Execute(request, cancellationToken)
84+
.ConfigureAwait(false);
7585
var authProviderResponse = await response
76-
.Deserialize<AuthProviders::AuthProviderResponse>()
86+
.Deserialize<AuthProviders::AuthProviderResponse>(cancellationToken)
7787
.ConfigureAwait(false);
7888
if (this._client.ResponseValidation)
7989
{
@@ -83,17 +93,20 @@ public AuthProviderService(IArcadeClient client)
8393
}
8494

8595
public async Task<AuthProviders::AuthProviderResponse> Get(
86-
AuthProviders::AuthProviderGetParams parameters
96+
AuthProviders::AuthProviderGetParams parameters,
97+
CancellationToken cancellationToken = default
8798
)
8899
{
89100
HttpRequest<AuthProviders::AuthProviderGetParams> request = new()
90101
{
91102
Method = HttpMethod.Get,
92103
Params = parameters,
93104
};
94-
using var response = await this._client.Execute(request).ConfigureAwait(false);
105+
using var response = await this
106+
._client.Execute(request, cancellationToken)
107+
.ConfigureAwait(false);
95108
var authProviderResponse = await response
96-
.Deserialize<AuthProviders::AuthProviderResponse>()
109+
.Deserialize<AuthProviders::AuthProviderResponse>(cancellationToken)
97110
.ConfigureAwait(false);
98111
if (this._client.ResponseValidation)
99112
{
@@ -103,17 +116,20 @@ public AuthProviderService(IArcadeClient client)
103116
}
104117

105118
public async Task<AuthProviders::AuthProviderResponse> Patch(
106-
AuthProviders::AuthProviderPatchParams parameters
119+
AuthProviders::AuthProviderPatchParams parameters,
120+
CancellationToken cancellationToken = default
107121
)
108122
{
109123
HttpRequest<AuthProviders::AuthProviderPatchParams> request = new()
110124
{
111125
Method = HttpMethod.Patch,
112126
Params = parameters,
113127
};
114-
using var response = await this._client.Execute(request).ConfigureAwait(false);
128+
using var response = await this
129+
._client.Execute(request, cancellationToken)
130+
.ConfigureAwait(false);
115131
var authProviderResponse = await response
116-
.Deserialize<AuthProviders::AuthProviderResponse>()
132+
.Deserialize<AuthProviders::AuthProviderResponse>(cancellationToken)
117133
.ConfigureAwait(false);
118134
if (this._client.ResponseValidation)
119135
{

src/ArcadeDotnet/Services/Admin/AuthProviders/IAuthProviderService.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34
using ArcadeDotnet.Core;
45
using AuthProviders = ArcadeDotnet.Models.Admin.AuthProviders;
@@ -13,32 +14,39 @@ public interface IAuthProviderService
1314
/// Create a new auth provider
1415
/// </summary>
1516
Task<AuthProviders::AuthProviderResponse> Create(
16-
AuthProviders::AuthProviderCreateParams parameters
17+
AuthProviders::AuthProviderCreateParams parameters,
18+
CancellationToken cancellationToken = default
1719
);
1820

1921
/// <summary>
2022
/// List a page of auth providers that are available to the caller
2123
/// </summary>
2224
Task<AuthProviders::AuthProviderListResponse> List(
23-
AuthProviders::AuthProviderListParams? parameters = null
25+
AuthProviders::AuthProviderListParams? parameters = null,
26+
CancellationToken cancellationToken = default
2427
);
2528

2629
/// <summary>
2730
/// Delete a specific auth provider
2831
/// </summary>
2932
Task<AuthProviders::AuthProviderResponse> Delete(
30-
AuthProviders::AuthProviderDeleteParams parameters
33+
AuthProviders::AuthProviderDeleteParams parameters,
34+
CancellationToken cancellationToken = default
3135
);
3236

3337
/// <summary>
3438
/// Get the details of a specific auth provider
3539
/// </summary>
36-
Task<AuthProviders::AuthProviderResponse> Get(AuthProviders::AuthProviderGetParams parameters);
40+
Task<AuthProviders::AuthProviderResponse> Get(
41+
AuthProviders::AuthProviderGetParams parameters,
42+
CancellationToken cancellationToken = default
43+
);
3744

3845
/// <summary>
3946
/// Patch an existing auth provider
4047
/// </summary>
4148
Task<AuthProviders::AuthProviderResponse> Patch(
42-
AuthProviders::AuthProviderPatchParams parameters
49+
AuthProviders::AuthProviderPatchParams parameters,
50+
CancellationToken cancellationToken = default
4351
);
4452
}

src/ArcadeDotnet/Services/Admin/Secrets/ISecretService.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34
using ArcadeDotnet.Core;
45
using Secrets = ArcadeDotnet.Models.Admin.Secrets;
@@ -12,10 +13,16 @@ public interface ISecretService
1213
/// <summary>
1314
/// List all secrets that are visible to the caller
1415
/// </summary>
15-
Task<Secrets::SecretListResponse> List(Secrets::SecretListParams? parameters = null);
16+
Task<Secrets::SecretListResponse> List(
17+
Secrets::SecretListParams? parameters = null,
18+
CancellationToken cancellationToken = default
19+
);
1620

1721
/// <summary>
1822
/// Delete a secret by its ID
1923
/// </summary>
20-
Task Delete(Secrets::SecretDeleteParams parameters);
24+
Task Delete(
25+
Secrets::SecretDeleteParams parameters,
26+
CancellationToken cancellationToken = default
27+
);
2128
}

src/ArcadeDotnet/Services/Admin/Secrets/SecretService.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Net.Http;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using ArcadeDotnet.Core;
56
using Secrets = ArcadeDotnet.Models.Admin.Secrets;
@@ -21,7 +22,8 @@ public SecretService(IArcadeClient client)
2122
}
2223

2324
public async Task<Secrets::SecretListResponse> List(
24-
Secrets::SecretListParams? parameters = null
25+
Secrets::SecretListParams? parameters = null,
26+
CancellationToken cancellationToken = default
2527
)
2628
{
2729
parameters ??= new();
@@ -31,9 +33,11 @@ public SecretService(IArcadeClient client)
3133
Method = HttpMethod.Get,
3234
Params = parameters,
3335
};
34-
using var response = await this._client.Execute(request).ConfigureAwait(false);
36+
using var response = await this
37+
._client.Execute(request, cancellationToken)
38+
.ConfigureAwait(false);
3539
var secrets = await response
36-
.Deserialize<Secrets::SecretListResponse>()
40+
.Deserialize<Secrets::SecretListResponse>(cancellationToken)
3741
.ConfigureAwait(false);
3842
if (this._client.ResponseValidation)
3943
{
@@ -42,13 +46,18 @@ public SecretService(IArcadeClient client)
4246
return secrets;
4347
}
4448

45-
public async Task Delete(Secrets::SecretDeleteParams parameters)
49+
public async Task Delete(
50+
Secrets::SecretDeleteParams parameters,
51+
CancellationToken cancellationToken = default
52+
)
4653
{
4754
HttpRequest<Secrets::SecretDeleteParams> request = new()
4855
{
4956
Method = HttpMethod.Delete,
5057
Params = parameters,
5158
};
52-
using var response = await this._client.Execute(request).ConfigureAwait(false);
59+
using var response = await this
60+
._client.Execute(request, cancellationToken)
61+
.ConfigureAwait(false);
5362
}
5463
}

src/ArcadeDotnet/Services/Admin/UserConnections/IUserConnectionService.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34
using ArcadeDotnet.Core;
45
using ArcadeDotnet.Models.Admin.UserConnections;
@@ -12,10 +13,16 @@ public interface IUserConnectionService
1213
/// <summary>
1314
/// List all auth connections
1415
/// </summary>
15-
Task<UserConnectionListPageResponse> List(UserConnectionListParams? parameters = null);
16+
Task<UserConnectionListPageResponse> List(
17+
UserConnectionListParams? parameters = null,
18+
CancellationToken cancellationToken = default
19+
);
1620

1721
/// <summary>
1822
/// Delete a user/auth provider connection
1923
/// </summary>
20-
Task Delete(UserConnectionDeleteParams parameters);
24+
Task Delete(
25+
UserConnectionDeleteParams parameters,
26+
CancellationToken cancellationToken = default
27+
);
2128
}

0 commit comments

Comments
 (0)