Skip to content

Commit f190c45

Browse files
authored
[SignalR] Fix code formats and docs (Azure#24895)
* Code cleanup * Fix name violation and others * Fix README.md * Update README
1 parent af9d76c commit f190c45

25 files changed

+147
-153
lines changed

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/Microsoft.Azure.WebJobs.Extensions.SignalRService.sln

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ MinimumVisualStudioVersion = 15.0.26124.0
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FFE2667E-131F-40CE-8851-AFAECFBF89BB}"
77
ProjectSection(SolutionItems) = preProject
88
Directory.Build.props = Directory.Build.props
9-
nuget.config = nuget.config
109
EndProjectSection
1110
EndProject
1211
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.SignalRService", "src\Microsoft.Azure.WebJobs.Extensions.SignalRService.csproj", "{02A467BA-E3F2-408D-AD49-CB317C430C53}"

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
This extension provides functionality for accessing [Azure SignalR Service](https://aka.ms/signalr_service) from an Azure Function.
44

5-
# Getting started
5+
## Getting started
66

77
### Install the package
88

@@ -18,10 +18,13 @@ dotnet add package Microsoft.Azure.WebJobs.Extensions.SignalRService
1818

1919
- **Azure SignalR resource:** To use SignalR Service client library you'll also need a Azure SignalR resource. If you are not familiar with creating Azure resources, you may wish to follow the step-by-step guide for creating a SignalR resource using the Azure portal. There, you can also find detailed instructions for using the Azure CLI, Azure PowerShell, or Azure Resource Manager (ARM) templates to create a SignalR resource.
2020

21-
To quickly create the needed SignalR resource in Azure and to receive a connection string for them, you can deploy our sample template by clicking:
21+
To quickly create the needed SignalR resource in Azure and to receive a connection string for them, you can deploy our sample template by clicking:
2222

23-
[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3a%2f%2fraw.githubusercontent.com%2fAzure%2fazure-quickstart-templates%2fmaster%2fquickstarts%2fmicrosoft.signalrservice%2fsignalr%2fazuredeploy.json)
23+
[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3a%2f%2fraw.githubusercontent.com%2fAzure%2fazure-quickstart-templates%2fmaster%2fquickstarts%2fmicrosoft.signalrservice%2fsignalr%2fazuredeploy.json)
2424

25+
After the instance is deployed, open it in the portal and locate its Settings page. Change the Service Mode setting to *Serverless*.
26+
27+
![SignalR Service mode setting](images/signalr-service-mode.png)
2528

2629
### Authenticate the client
2730

@@ -44,7 +47,7 @@ For local development, use the `local.settings.json` file to store the connectio
4447
```json
4548
{
4649
"Values": {
47-
"<connection_name>": "<connection string>"
50+
"<connection_name>": "<connection-string>"
4851
}
4952
}
5053
```
@@ -84,12 +87,9 @@ Please follow the [Azure SignalR trigger](https://docs.microsoft.com/azure/azure
8487

8588
## Supported scenarios
8689
- Negotiate for a SignalR client.
87-
- Broadcast messages to all SignalR clients connected to a SignalR Service hub.
88-
- Send messages to a single user, or all the users in a group.
89-
- Manage group users like add/remove a single user in a group.
90-
<!-- TODO: Add this point in next PR
91-
Use multiple Azure SignalR Service instances for resiliency and disaster recovery in Azure Functions. See details in [Multiple SignalR service endpoint support](./docs/sharding.md).
92-
-->
90+
- Manage group like add/remove a single user/connection in a group.
91+
- Send messages to a single user/connection, to a group, to all users/connections.
92+
- Use multiple Azure SignalR Service instances for resiliency and disaster recovery in Azure Functions. See details in [Multiple Azure SignalR Service Instances Support in Azure Functions](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/docs/sharding.md).
9393

9494
## Examples
9595

3.47 KB
Loading

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Auth/DefaultSecurityTokenValidator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ internal class DefaultSecurityTokenValidator : ISecurityTokenValidator
1212
{
1313
private const string AuthHeaderName = "Authorization";
1414
private const string BearerPrefix = "Bearer ";
15-
private readonly TokenValidationParameters tokenValidationParameters = new TokenValidationParameters();
16-
private readonly JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
15+
private readonly TokenValidationParameters _tokenValidationParameters = new();
16+
private readonly JwtSecurityTokenHandler _handler = new();
1717

1818
public DefaultSecurityTokenValidator(Action<TokenValidationParameters> configureTokenValidationParameters)
1919
{
2020
if (configureTokenValidationParameters == null)
2121
{
2222
throw new ArgumentNullException(nameof(configureTokenValidationParameters));
2323
}
24-
configureTokenValidationParameters(tokenValidationParameters);
24+
configureTokenValidationParameters(_tokenValidationParameters);
2525
}
2626

2727
public SecurityTokenResult ValidateToken(HttpRequest request)
@@ -34,7 +34,7 @@ public SecurityTokenResult ValidateToken(HttpRequest request)
3434
if (authHeaderValue.StartsWith(BearerPrefix, StringComparison.OrdinalIgnoreCase))
3535
{
3636
var token = authHeaderValue.Substring(BearerPrefix.Length);
37-
var principal = handler.ValidateToken(token, tokenValidationParameters, out _);
37+
var principal = _handler.ValidateToken(token, _tokenValidationParameters, out _);
3838

3939
return SecurityTokenResult.Success(principal);
4040
}

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Bindings/JTokenExtensions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
using Newtonsoft.Json;
54
using Newtonsoft.Json.Linq;
65

76
namespace Microsoft.Azure.WebJobs.Extensions.SignalRService

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Bindings/SignalRAsyncCollector.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ namespace Microsoft.Azure.WebJobs.Extensions.SignalRService
1212
/// </summary>
1313
public class SignalRAsyncCollector<T> : IAsyncCollector<T>
1414
{
15-
private readonly IAzureSignalRSender client;
16-
private readonly SignalROutputConverter converter;
15+
private readonly IAzureSignalRSender _client;
16+
private readonly SignalROutputConverter _converter;
1717

1818
internal SignalRAsyncCollector(IAzureSignalRSender client)
1919
{
20-
this.client = client;
21-
converter = new SignalROutputConverter();
20+
_client = client;
21+
_converter = new();
2222
}
2323

2424
public async Task AddAsync(T item, CancellationToken cancellationToken = default(CancellationToken))
@@ -28,11 +28,11 @@ internal SignalRAsyncCollector(IAzureSignalRSender client)
2828
throw new ArgumentNullException(nameof(item));
2929
}
3030

31-
var convertItem = converter.ConvertToSignalROutput(item);
31+
var convertItem = _converter.ConvertToSignalROutput(item);
3232

3333
if (convertItem.GetType() == typeof(SignalRMessage))
3434
{
35-
SignalRMessage message = convertItem as SignalRMessage;
35+
var message = convertItem as SignalRMessage;
3636
var data = new SignalRData
3737
{
3838
Target = message.Target,
@@ -42,35 +42,35 @@ internal SignalRAsyncCollector(IAzureSignalRSender client)
4242

4343
if (!string.IsNullOrEmpty(message.ConnectionId))
4444
{
45-
await client.SendToConnection(message.ConnectionId, data).ConfigureAwait(false);
45+
await _client.SendToConnection(message.ConnectionId, data).ConfigureAwait(false);
4646
}
4747
else if (!string.IsNullOrEmpty(message.UserId))
4848
{
49-
await client.SendToUser(message.UserId, data).ConfigureAwait(false);
49+
await _client.SendToUser(message.UserId, data).ConfigureAwait(false);
5050
}
5151
else if (!string.IsNullOrEmpty(message.GroupName))
5252
{
53-
await client.SendToGroup(message.GroupName, data).ConfigureAwait(false);
53+
await _client.SendToGroup(message.GroupName, data).ConfigureAwait(false);
5454
}
5555
else
5656
{
57-
await client.SendToAll(data).ConfigureAwait(false);
57+
await _client.SendToAll(data).ConfigureAwait(false);
5858
}
5959
}
6060
else if (convertItem.GetType() == typeof(SignalRGroupAction))
6161
{
62-
SignalRGroupAction groupAction = convertItem as SignalRGroupAction;
62+
var groupAction = convertItem as SignalRGroupAction;
6363

6464
if (!string.IsNullOrEmpty(groupAction.ConnectionId))
6565
{
6666
switch (groupAction.Action)
6767
{
6868
case GroupAction.Add:
69-
await client.AddConnectionToGroup(groupAction).ConfigureAwait(false);
69+
await _client.AddConnectionToGroup(groupAction).ConfigureAwait(false);
7070
break;
7171

7272
case GroupAction.Remove:
73-
await client.RemoveConnectionFromGroup(groupAction).ConfigureAwait(false);
73+
await _client.RemoveConnectionFromGroup(groupAction).ConfigureAwait(false);
7474
break;
7575
}
7676
}
@@ -79,15 +79,15 @@ internal SignalRAsyncCollector(IAzureSignalRSender client)
7979
switch (groupAction.Action)
8080
{
8181
case GroupAction.Add:
82-
await client.AddUserToGroup(groupAction).ConfigureAwait(false);
82+
await _client.AddUserToGroup(groupAction).ConfigureAwait(false);
8383
break;
8484

8585
case GroupAction.Remove:
86-
await client.RemoveUserFromGroup(groupAction).ConfigureAwait(false);
86+
await _client.RemoveUserFromGroup(groupAction).ConfigureAwait(false);
8787
break;
8888

8989
case GroupAction.RemoveAll:
90-
await client.RemoveUserFromAllGroups(groupAction).ConfigureAwait(false);
90+
await _client.RemoveUserFromAllGroups(groupAction).ConfigureAwait(false);
9191
break;
9292
}
9393
}

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Bindings/SignalRInputBindings/SecurityTokenValidationInputBinding/SecurityTokenValidationInputBinding.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,28 @@ namespace Microsoft.Azure.WebJobs.Extensions.SignalRService
1212
internal class SecurityTokenValidationInputBinding : IBinding
1313
{
1414
private const string HttpRequestName = "$request";
15-
private readonly ISecurityTokenValidator securityTokenValidator;
15+
private readonly ISecurityTokenValidator _securityTokenValidator;
1616

1717
public bool FromAttribute { get; }
1818

1919
public SecurityTokenValidationInputBinding(ISecurityTokenValidator securityTokenValidator)
2020
{
21-
this.securityTokenValidator = securityTokenValidator;
21+
_securityTokenValidator = securityTokenValidator;
2222
}
2323

2424
public Task<IValueProvider> BindAsync(object value, ValueBindingContext context)
2525
{
26-
var request = ((BindingContext)value).BindingData[HttpRequestName] as HttpRequest;
27-
28-
if (request == null)
26+
if (((BindingContext)value).BindingData[HttpRequestName] is not HttpRequest request)
2927
{
3028
throw new NotSupportedException($"Argument {nameof(HttpRequest)} is null. {nameof(SecurityTokenValidationAttribute)} must work with HttpTrigger.");
3129
}
3230

33-
if (securityTokenValidator == null)
31+
if (_securityTokenValidator == null)
3432
{
3533
return Task.FromResult<IValueProvider>(new SecurityTokenValidationValueProvider(null, ""));
3634
}
3735

38-
return Task.FromResult<IValueProvider>(new SecurityTokenValidationValueProvider(securityTokenValidator.ValidateToken(request), ""));
36+
return Task.FromResult<IValueProvider>(new SecurityTokenValidationValueProvider(_securityTokenValidator.ValidateToken(request), ""));
3937
}
4038

4139
public Task<IValueProvider> BindAsync(BindingContext context)

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Bindings/SignalRInputBindings/SecurityTokenValidationInputBinding/SecurityTokenValidationValueProvider.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@ namespace Microsoft.Azure.WebJobs.Extensions.SignalRService
99
{
1010
internal class SecurityTokenValidationValueProvider : IValueProvider
1111
{
12-
private SecurityTokenResult result;
13-
private string invokeString;
12+
private readonly SecurityTokenResult _result;
13+
private readonly string _invokeString;
1414

1515
// todo: fix invoke string in another PR
1616
public SecurityTokenValidationValueProvider(SecurityTokenResult result, string invokeString)
1717
{
18-
this.result = result;
19-
this.invokeString = invokeString;
18+
_result = result;
19+
_invokeString = invokeString;
2020
}
2121

2222
public Task<object> GetValueAsync()
2323
{
24-
return Task.FromResult<object>(result);
24+
return Task.FromResult<object>(_result);
2525
}
2626

2727
public string ToInvokeString()
2828
{
29-
return invokeString;
29+
return _invokeString;
3030
}
3131

3232
public Type Type => typeof(SecurityTokenResult);

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Bindings/SignalRInputBindings/SignalRConnectionInputBinding/SignalRConnectionInfoValueProvider.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@ namespace Microsoft.Azure.WebJobs.Extensions.SignalRService
1010
{
1111
internal class SignalRConnectionInfoValueProvider : IValueProvider
1212
{
13-
private SignalRConnectionInfo info;
14-
private string invokeString;
13+
private readonly SignalRConnectionInfo _info;
14+
private readonly string _invokeString;
15+
16+
public Type Type { get; }
1517

1618
// todo: fix invoke string in another PR
1719
public SignalRConnectionInfoValueProvider(SignalRConnectionInfo info, Type type, string invokeString)
1820
{
19-
this.info = info;
20-
this.invokeString = invokeString;
21-
this.Type = type;
21+
_info = info;
22+
_invokeString = invokeString;
23+
Type = type;
2224
}
2325

2426
public Task<object> GetValueAsync()
@@ -28,23 +30,21 @@ public Task<object> GetValueAsync()
2830

2931
public string ToInvokeString()
3032
{
31-
return invokeString;
33+
return _invokeString;
3234
}
3335

34-
public Type Type { get; }
35-
3636
private object GetUserTypeInfo()
3737
{
3838
if (Type == typeof(JObject))
3939
{
40-
return JObject.FromObject(info);
40+
return JObject.FromObject(_info);
4141
}
4242
if (Type == typeof(string))
4343
{
44-
return JObject.FromObject(info).ToString();
44+
return JObject.FromObject(_info).ToString();
4545
}
4646

47-
return info;
47+
return _info;
4848
}
4949
}
5050
}

sdk/signalr/Microsoft.Azure.WebJobs.Extensions.SignalRService/src/Bindings/SignalRInputBindings/SignalRConnectionInputBinding/SignalRConnectionInputBinding.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ namespace Microsoft.Azure.WebJobs.Extensions.SignalRService
1313
internal class SignalRConnectionInputBinding : BindingBase<SignalRConnectionInfoAttribute>
1414
{
1515
private const string HttpRequestName = "$request";
16-
private readonly ISecurityTokenValidator securityTokenValidator;
17-
private readonly ISignalRConnectionInfoConfigurer signalRConnectionInfoConfigurer;
18-
private readonly IServiceManagerStore managerStore;
19-
private readonly Type userType;
16+
private readonly ISecurityTokenValidator _securityTokenValidator;
17+
private readonly ISignalRConnectionInfoConfigurer _signalRConnectionInfoConfigurer;
18+
private readonly IServiceManagerStore _managerStore;
19+
private readonly Type _userType;
2020

2121
public SignalRConnectionInputBinding(
2222
BindingProviderContext context,
@@ -25,43 +25,43 @@ public SignalRConnectionInputBinding(
2525
ISecurityTokenValidator securityTokenValidator,
2626
ISignalRConnectionInfoConfigurer signalRConnectionInfoConfigurer) : base(context, configuration, nameResolver)
2727
{
28-
this.securityTokenValidator = securityTokenValidator;
29-
this.signalRConnectionInfoConfigurer = signalRConnectionInfoConfigurer;
30-
this.managerStore = StaticServiceHubContextStore.ServiceManagerStore;
31-
this.userType = context.Parameter.ParameterType;
28+
_securityTokenValidator = securityTokenValidator;
29+
_signalRConnectionInfoConfigurer = signalRConnectionInfoConfigurer;
30+
_managerStore = StaticServiceHubContextStore.ServiceManagerStore;
31+
_userType = context.Parameter.ParameterType;
3232
}
3333

34-
protected async override Task<IValueProvider> BuildAsync(SignalRConnectionInfoAttribute attrResolved,
34+
protected override async Task<IValueProvider> BuildAsync(SignalRConnectionInfoAttribute attrResolved,
3535
IReadOnlyDictionary<string, object> bindingData)
3636
{
37-
var azureSignalRClient = await Utils.GetAzureSignalRClientAsync(attrResolved.ConnectionStringSetting, attrResolved.HubName, managerStore).ConfigureAwait(false);
37+
var azureSignalRClient = await Utils.GetAzureSignalRClientAsync(attrResolved.ConnectionStringSetting, attrResolved.HubName, _managerStore).ConfigureAwait(false);
3838
bindingData.TryGetValue(HttpRequestName, out var requestObj);
3939
var request = requestObj as HttpRequest;
4040
var httpContext = request?.HttpContext;
4141

42-
if (bindingData.ContainsKey(HttpRequestName) && securityTokenValidator != null)
42+
if (bindingData.ContainsKey(HttpRequestName) && _securityTokenValidator != null)
4343
{
44-
var tokenResult = securityTokenValidator.ValidateToken(request);
44+
var tokenResult = _securityTokenValidator.ValidateToken(request);
4545

4646
if (tokenResult.Status != SecurityTokenStatus.Valid)
4747
{
48-
return new SignalRConnectionInfoValueProvider(null, userType, "");
48+
return new SignalRConnectionInfoValueProvider(null, _userType, "");
4949
}
5050

5151
var signalRConnectionDetail = new SignalRConnectionDetail
5252
{
5353
UserId = attrResolved.UserId,
5454
Claims = azureSignalRClient.GetCustomClaims(attrResolved.IdToken, attrResolved.ClaimTypeList),
5555
};
56-
signalRConnectionInfoConfigurer?.Configure(tokenResult, request, signalRConnectionDetail);
56+
_signalRConnectionInfoConfigurer?.Configure(tokenResult, request, signalRConnectionDetail);
5757
var customizedInfo = await azureSignalRClient.GetClientConnectionInfoAsync(signalRConnectionDetail.UserId,
5858
signalRConnectionDetail.Claims, httpContext).ConfigureAwait(false);
59-
return new SignalRConnectionInfoValueProvider(customizedInfo, userType, "");
59+
return new SignalRConnectionInfoValueProvider(customizedInfo, _userType, "");
6060
}
6161

6262
var info = await azureSignalRClient.GetClientConnectionInfoAsync(attrResolved.UserId, attrResolved.IdToken,
6363
attrResolved.ClaimTypeList, httpContext).ConfigureAwait(false);
64-
return new SignalRConnectionInfoValueProvider(info, userType, "");
64+
return new SignalRConnectionInfoValueProvider(info, _userType, "");
6565
}
6666
}
6767
}

0 commit comments

Comments
 (0)